Adalah mungkin untuk menggunakan JIKA pasal dalam DIMANA klausul dalam MS SQL?
Contoh:
WHERE
IF IsNumeric(@OrderNumber) = 1
OrderNumber = @OrderNumber
ELSE
OrderNumber LIKE '%' + @OrderNumber + '%'
Gunakan KASUS pernyataan UPDATE: sebelumnya sintaks (seperti yang ditunjukkan oleh beberapa orang) doesn't bekerja. Anda dapat menggunakan HAL sebagai berikut:
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@OrderNumber
ELSE
'%' + @OrderNumber
END
Atau anda dapat menggunakan aplikasi JIKA pernyataan seperti @N. J. Reed poin.
Anda harus dapat melakukan ini tanpa ada 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 untuk men-tweak gips pada urutan nomor ke INT atau VARCHAR tergantung pada apakah implisit gips yang didukung.
Ini adalah teknik yang sangat umum di MANA klausa. Jika anda ingin menerapkan beberapa "JIKA" logika dalam klausul MANA semua yang perlu anda lakukan adalah menambahkan ekstra dengan kondisi boolean DAN ke bagian mana perlu diterapkan.
Ada isn't cara yang baik untuk melakukan hal ini dalam SQL. Beberapa pendekatan yang saya lihat:
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
IF (IsNumeric(@OrderNumber)) = 1
BEGIN
SELECT * FROM Table
WHERE @OrderNumber = OrderNumber
END ELSE BEGIN
SELECT * FROM Table
WHERE OrderNumber LIKE '%' + @OrderNumber
END
3 pendekatan yang lebih mengerikan, tetapi itu's hampir satu-satunya yang berpikir bahwa bekerja jika anda memiliki jumlah variabel kondisi seperti itu.
Anda ingin KASUS pernyataan
WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber)=1 THEN @OrderNumber ELSE '%' + @OrderNumber END
Saya berpikir bahwa di mana...suka/=...kasus...maka... dapat bekerja sama dengan Boolean. Saya menggunakan T-SQL.
Skenario: Let's mengatakan anda ingin mendapatkan Orang-30's hobi jika bool adalah palsu, dan Orang-42's hobi jika bool benar. (Menurut beberapa orang, hobi-pencarian terdiri lebih dari 90% dari bisnis perhitungan siklus, sehingga membayar dekat attn.).
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;
Berikut contoh mengeksekusi query sebagai bagian dari ekspresi Boolean dan kemudian mengeksekusi sedikit berbeda pernyataan blok berdasarkan hasil dari ekspresi Boolean. Masing-masing pernyataan blok diawali dengan BEGIN dan melengkapi 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 nested IF...ELSE pernyataan Contoh berikut menunjukkan bagaimana IF ... ELSE pernyataan dapat bersarang di dalam yang lain. Set @Jumlah variabel 5, 50, dan 500 untuk menguji masing-masing 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
KASUS Pernyataan adalah pilihan 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
Sejalan kasus Kondisi ini akan bekerja dengan baik.
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
Melihat 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