it-swarm-id.com

SQL: JIKA klausa dalam klausa WHERE

Apakah mungkin untuk menggunakan klausa IF dalam sebuah (_ di mana _ klausa dalam MS SQL?

Contoh:

WHERE
    IF IsNumeric(@OrderNumber) = 1
        OrderNumber = @OrderNumber
    ELSE
        OrderNumber LIKE '%' + @OrderNumber + '%'
180
Bryan Roth

Gunakan pernyataan CASE
PEMBARUAN: Sintaks sebelumnya (seperti yang ditunjukkan oleh beberapa orang) tidak berfungsi. Anda dapat menggunakan CASE sebagai berikut:

WHERE OrderNumber LIKE
  CASE WHEN IsNumeric(@OrderNumber) = 1 THEN 
    @OrderNumber 
  ELSE
    '%' + @OrderNumber
  END

Atau Anda dapat menggunakan pernyataan IF seperti @ N. J. Reed menunjukkan.

193
bdukes

Anda harus dapat melakukan ini tanpa JIKA atau KASUS

 WHERE 
   (IsNumeric(@OrderNumber) AND
      (CAST OrderNumber AS VARCHAR) = (CAST @OrderNumber AS VARCHAR)
 OR
   (NOT IsNumeric(@OrderNumber) AND
       OrderNumber LIKE ('%' + @OrderNumber))

Tergantung pada rasa SQL Anda mungkin perlu Tweak gips pada nomor urut ke INT atau VARCHAR tergantung pada apakah gips implisit didukung.

Ini adalah teknik yang sangat umum dalam klausa WHERE. Jika Anda ingin menerapkan beberapa logika "JIKA" dalam klausa WHERE yang perlu Anda lakukan adalah menambahkan kondisi ekstra dengan boolean DAN ke bagian di mana ia perlu diterapkan.

128
njr101

Anda tidak membutuhkan pernyataan IF sama sekali.

WHERE
    (IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
20
Rivanni

Tidak ada cara yang baik untuk melakukan ini dalam SQL. Beberapa pendekatan yang saya lihat:

1) Gunakan CASE yang dikombinasikan dengan operator boolean:

WHERE
    OrderNumber = CASE 
        WHEN (IsNumeric(@OrderNumber) = 1)
        THEN CONVERT(INT, @OrderNumber)
        ELSE -9999 -- Some numeric value that just cannot exist in the column
    END
    OR 
    FirstName LIKE CASE
        WHEN (IsNumeric(@OrderNumber) = 0)
        THEN '%' + @OrderNumber
        ELSE ''
    END

2) Gunakan IF di luar SELECT

IF (IsNumeric(@OrderNumber)) = 1
BEGIN
    SELECT * FROM Table
    WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
    SELECT * FROM Table
    WHERE OrderNumber LIKE '%' + @OrderNumber
END

3) Menggunakan string panjang, buat pernyataan SQL Anda secara kondisional, lalu gunakan EXEC

Pendekatan ke-3 mengerikan, tetapi hampir satu-satunya pemikiran yang berfungsi jika Anda memiliki sejumlah kondisi variabel seperti itu.

13
Euro Micelli

Gunakan pernyataan CASE sebagai ganti IF.

6
Joel Coehoorn

Anda ingin pernyataan KASUS

WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
4
Jeff Martin

Saya pikir di mana ... suka/= ... huruf ... maka ... dapat bekerja dengan Boolean. Saya menggunakan T-SQL.

Skenario: Katakanlah Anda ingin mendapatkan hobi Person-30 jika bool salah, dan hobi Person-42 jika bool benar. (Menurut beberapa orang, pencarian hobi mencakup lebih dari 90% siklus perhitungan bisnis, jadi perhatikan baik-baik.).

CREATE PROCEDURE sp_Case
@bool   bit
AS
SELECT Person.Hobbies
FROM Person
WHERE Person.ID = 
    case @bool 
        when 0 
            then 30
        when 1
            then 42
    end;
3
William
 DIMANA (IsNumeric (@OrderNumber) <> 1 OR OrderNumber = @OrderNumber) 
 DAN (IsNumber (@OrderNumber) = 1 OR OrderNumber LIKE '%' 
 + @OrderNumber + '%') 
1
WhoIsNinja

Contoh berikut mengeksekusi kueri sebagai bagian dari ekspresi Boolean dan kemudian mengeksekusi blok pernyataan yang sedikit berbeda berdasarkan hasil dari ekspresi Boolean. Setiap blok pernyataan dimulai dengan BEGIN dan dilengkapi dengan END.

USE AdventureWorks2012;
GO
DECLARE @AvgWeight decimal(8,2), @BikeCount int
IF 
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
BEGIN
   SET @BikeCount = 
        (SELECT COUNT(*) 
         FROM Production.Product 
         WHERE Name LIKE 'Touring-3000%');
   SET @AvgWeight = 
        (SELECT AVG(Weight) 
         FROM Production.Product 
         WHERE Name LIKE 'Touring-3000%');
   PRINT 'There are ' + CAST(@BikeCount AS varchar(3)) + ' Touring-3000 bikes.'
   PRINT 'The average weight of the top 5 Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.';
END
ELSE 
BEGIN
SET @AvgWeight = 
        (SELECT AVG(Weight)
         FROM Production.Product 
         WHERE Name LIKE 'Touring-3000%' );
   PRINT 'Average weight of the Touring-3000 bikes is ' + CAST(@AvgWeight AS varchar(8)) + '.' ;
END ;
GO

Menggunakan pernyataan IF ... ELSE bersarang Contoh berikut menunjukkan bagaimana pernyataan IF ... ELSE dapat bersarang di dalam yang lain. Atur variabel @Number ke 5, 50, dan 500 untuk menguji setiap pernyataan.

DECLARE @Number int
SET @Number = 50
IF @Number > 100
   PRINT 'The number is large.'
ELSE 
   BEGIN
      IF @Number < 10
      PRINT 'The number is small'
   ELSE
      PRINT 'The number is medium'
   END ;
GO
0
hossein

CASE Pernyataan adalah opsi yang lebih baik daripada IF selalu.

  WHERE  vfl.CreatedDate >= CASE WHEN @FromDate IS NULL THEN vfl.CreatedDate ELSE  @FromDate END
    AND vfl.CreatedDate<=CASE WHEN @ToDate IS NULL THEN vfl.CreatedDate ELSE @ToDate END 
0
Majedur Rahaman