Apakah mungkin untuk menggunakan klausa IF dalam klausa WHERE di MS SQL?
Contoh:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Apakah mungkin untuk menggunakan klausa IF dalam klausa WHERE di MS SQL?
Contoh:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Jawaban:
Gunakan UPDATE pernyataan KASUS
: 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 @ NJ Reed tunjukkan.
CASE
adalah solusi yang tepat dalam banyak kasus. Dalam kasus saya, saya ingin mengubah operator perbandingan dan karenanya saya menggunakan pendekatan berikutnya.
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 mengubah gips pada nomor pesanan 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" di klausa WHERE yang perlu Anda lakukan adalah menambahkan kondisi ekstra dengan boolean DAN ke bagian di mana ia perlu diterapkan.
Anda tidak membutuhkan pernyataan IF sama sekali.
WHERE
(IsNumeric(@OrderNumber) = 1 AND OrderNumber = @OrderNumber)
OR (IsNumeric(@OrderNumber) = 0 AND OrderNumber LIKE '%' + @OrderNumber + '%')
where (@AdmUserId is null or CurrentOrder.CustomerAdmUserId = @AdmUserId)
Atau hanya filter jika IncludeDeleted = 0: where (@IncludeDeleted = 1 or ItemObject.DeletedFlag = 0)
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, dan kemudian gunakan EXEC
Pendekatan ke-3 mengerikan, tetapi hampir satu-satunya pemikiran yang berfungsi jika Anda memiliki sejumlah kondisi variabel seperti itu.
IF...ELSE...
persyaratan Anda menjadi boolean AND
dan OR
seperti pada @ njr101 jawaban di atas. Kelemahan dari pendekatan ini adalah sulitnya otak jika Anda memiliki banyak IF
, atau jika Anda memiliki banyak yang bersarang
Gunakan pernyataan KASUS sebagai ganti IF.
Anda ingin pernyataan KASUS
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
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;
WHERE (IsNumeric (@OrderNumber) <> 1 ATAU OrderNumber = @OrderNumber) AND (IsNumber (@OrderNumber) = 1 ATAU OrderNumber SUKA '%' + @OrderNumber + '%')
IF P THEN Q ELSE R
<=>
( ( NOT P ) OR Q ) AND ( P OR R )
Pernyataan KASUS adalah opsi yang lebih baik daripada JIKA 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
WHERE OrderNumber LIKE CASE WHEN IsNumeric(@OrderNumber) = 1 THEN @OrderNumber ELSE '%' + @OrderNumber END
Dalam kondisi line case akan bekerja dengan baik.
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
Dalam sql server saya punya masalah yang sama saya ingin menggunakan dan pernyataan hanya jika parameter salah dan benar saya harus menunjukkan nilai benar dan salah jadi saya menggunakannya dengan cara ini
(T.IsPublic = @ShowPublic or @ShowPublic = 1)
If @LstTransDt is Null
begin
Set @OpenQty=0
end
else
begin
Select @OpenQty=IsNull(Sum(ClosingQty),0)
From ProductAndDepotWiseMonitoring
Where Pcd=@PCd And PtpCd=@PTpCd And TransDt=@LstTransDt
end
Lihat apakah ini membantu.
USE AdventureWorks2012;
GO
IF
(SELECT COUNT(*) FROM Production.Product WHERE Name LIKE 'Touring-3000%' ) > 5
PRINT 'There are more than 5 Touring-3000 bicycles.'
ELSE PRINT 'There are 5 or less Touring-3000 bicycles.' ;
GO