Bagaimana cara melakukan IF...THEN
dalam sebuah SQL SELECT
pernyataan?
Sebagai contoh:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
dan CHECK
tetapi tidak SELECT
.
Bagaimana cara melakukan IF...THEN
dalam sebuah SQL SELECT
pernyataan?
Sebagai contoh:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
dan CHECK
tetapi tidak SELECT
.
Jawaban:
The CASE
pernyataan adalah yang paling dekat dengan IF di SQL dan didukung pada semua versi SQL Server.
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
Anda hanya perlu melakukan CAST
jika Anda menginginkan hasilnya sebagai nilai Boolean. Jika Anda senang dengan int
, ini berfungsi:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
pernyataan dapat disematkan dalam CASE
pernyataan lain dan bahkan dimasukkan dalam agregat.
SQL Server Denali (SQL Server 2012) menambahkan pernyataan IIF yang juga tersedia dalam akses (ditunjukkan oleh Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Pernyataan kasus adalah teman Anda dalam situasi ini, dan mengambil salah satu dari dua bentuk:
Kasus sederhana:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Kasus diperpanjang:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Anda bahkan dapat memasukkan pernyataan kasus dalam urutan dengan klausa untuk pemesanan yang benar-benar mewah.
AS Col_Name
setelah END
untuk memberi nama kolom yang dihasilkan
Dari SQL Server 2012 Anda dapat menggunakan IIF
fungsi untuk ini.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Ini secara efektif hanya cara penulisan (walaupun bukan SQL standar) penulisan CASE
.
Saya lebih suka keringkasan jika dibandingkan dengan CASE
versi yang diperluas .
Keduanya IIF()
dan CASE
diselesaikan sebagai ekspresi dalam pernyataan SQL dan hanya dapat digunakan di tempat yang didefinisikan dengan baik.
Ekspresi CASE tidak dapat digunakan untuk mengontrol aliran eksekusi pernyataan Transact-SQL, blok pernyataan, fungsi yang ditentukan pengguna, dan prosedur tersimpan.
Jika kebutuhan Anda tidak dapat dipenuhi oleh batasan-batasan ini (misalnya, kebutuhan untuk mengembalikan set hasil yang berbeda tergantung pada beberapa kondisi) maka SQL Server juga memiliki IF
kata kunci prosedural .
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Anda dapat menemukan beberapa contoh yang bagus dalam Kekuatan Pernyataan KASUS SQL , dan saya pikir pernyataan yang dapat Anda gunakan akan menjadi sesuatu seperti ini (dari 4guysfromrolla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Gunakan KASUS. Sesuatu seperti ini.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Microsoft SQL Server (T-SQL)
Dalam select
, gunakan:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Dalam sebuah where
klausa, gunakan:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'
dan memotong di mana setengah praktis
Dari tautan ini , kita dapat memahami IF THEN ELSE
dalam T-SQL:
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'ALFKI')
PRINT 'Need to update Customer Record ALFKI'
ELSE
PRINT 'Need to add Customer Record ALFKI'
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'LARSE')
PRINT 'Need to update Customer Record LARSE'
ELSE
PRINT 'Need to add Customer Record LARSE'
Bukankah ini cukup baik untuk T-SQL?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Pernyataan if-else sederhana di SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Pernyataan bersarang jika ... di SQL Server -
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand.';
ELSE
BEGIN
IF @val < 50
PRINT 'what''s up?';
ELSE
PRINT 'Bye Ravi Anand.';
END;
GO
SELECT
seperti yang diminta OP?
Fitur baru, IIF (yang bisa kita gunakan), ditambahkan di SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Gunakan logika bit murni:
DECLARE @Product TABLE (
id INT PRIMARY KEY IDENTITY NOT NULL
,Obsolote CHAR(1)
,Instock CHAR(1)
)
INSERT INTO @Product ([Obsolote], [Instock])
VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')
;
WITH cte
AS
(
SELECT
'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
,*
FROM
@Product AS p
)
SELECT
'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
,*
FROM
[cte] c
Lihat demo yang berfungsi: jika kemudian tanpa case
di SQL Server .
Untuk memulai, Anda perlu menghitung nilai true
dan false
untuk kondisi yang dipilih. Inilah dua NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
dikombinasikan bersama memberikan 1 atau 0. Selanjutnya gunakan operator bitwise .
Ini adalah metode yang paling WYSIWYG .
SELECT 1 AS Saleable, *
FROM @Product
WHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *
FROM @Product
WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
case statement some what similar to if in SQL server
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Ini bukan jawaban, hanya contoh pernyataan KASUS yang digunakan tempat saya bekerja. Ini memiliki pernyataan KASUS bersarang. Sekarang Anda tahu mengapa mata saya juling.
CASE orweb2.dbo.Inventory.RegulatingAgencyName
WHEN 'Region 1'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 2'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 3'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'DEPT OF AGRICULTURE'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
ELSE (
CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
WHEN 1
THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
END
)
END AS [County Contact Name]
CASE
menjadi terangkat dan ditandai sebagai jawaban alih-alih IF
yang seharusnya menjadi jawaban, seperti ini, ini masih merupakan CASE
pernyataan, bukan sebuah IF
.
Jika Anda memasukkan hasil ke dalam tabel untuk pertama kalinya, alih-alih mentransfer hasil dari satu tabel ke tabel lainnya, ini berfungsi di Oracle 11.2g:
INSERT INTO customers (last_name, first_name, city)
SELECT 'Doe', 'John', 'Chicago' FROM dual
WHERE NOT EXISTS
(SELECT '1' from customers
where last_name = 'Doe'
and first_name = 'John'
and city = 'Chicago');
Sebagai solusi alternatif untuk CASE
pernyataan tersebut, pendekatan berbasis tabel dapat digunakan:
DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10))
INSERT INTO @Product VALUES
(1,'N','Y'),
(2,'A','B'),
(3,'N','B'),
(4,'A','Y')
SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
FROM
@Product P
LEFT JOIN
( VALUES
( 'N', 'Y', 1 )
) Stmt (Obsolete, InStock, Saleable)
ON P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete
Hasil:
ID Obsolete InStock Saleable
----------- ---------- ---------- -----------
1 N Y 1
2 A B 0
3 N B 1
4 A Y 1
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
Bagi mereka yang menggunakan SQL Server 2012, IIF adalah fitur yang telah ditambahkan dan berfungsi sebagai alternatif untuk pernyataan Kasus.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
Anda dapat memiliki dua pilihan untuk menerapkan ini:
Menggunakan IIF, yang diperkenalkan dari SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Menggunakan Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Pertanyaan:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
Menggunakan alias - p
dalam hal ini - akan membantu mencegah masalah.
Menggunakan SQL CASE sama seperti pernyataan If / Else biasa. Dalam kueri di bawah ini, Jika nilai usang = 'N' atau Jika nilai InStock = 'Y' maka Output akan menjadi 1. Jika tidak, output akan menjadi 0. Kemudian kita menempatkan nilai 0 atau 1 di bawah kolom Salable.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Ini akan menjadi sesuatu seperti itu:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
Demi kelengkapan, saya akan menambahkan bahwa SQL menggunakan logika bernilai tiga. Ekspresi:
obsolete = 'N' OR instock = 'Y'
Dapat menghasilkan tiga hasil berbeda:
| obsolete | instock | saleable |
|----------|---------|----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
Jadi misalnya jika suatu produk sudah usang tetapi Anda tidak tahu apakah produk tersebut tidak berharga maka Anda tidak tahu apakah produk itu dapat dijual. Anda dapat menulis logika tiga nilai ini sebagai berikut:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Setelah Anda mengetahui cara kerjanya, Anda bisa mengonversi tiga hasil menjadi dua hasil dengan memutuskan perilaku nol. Misalnya ini akan memperlakukan null sebagai tidak terjual:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Saya suka menggunakan pernyataan KASUS tetapi pertanyaannya meminta pernyataan IF di Pilih SQL. Apa yang saya gunakan di masa lalu adalah:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
Ini seperti pernyataan excel atau sheet IF di mana ada kondisi yang diikuti oleh kondisi sebenarnya dan kemudian kondisi salah:
if(condition, true, false)
Selain itu, Anda dapat membuat pernyataan if (tetapi kemudian gunakan harus menggunakan KASUS :-)
(Catatan: ini berfungsi di MySQLWorkbench tetapi mungkin tidak berfungsi di platform lain)
Anda dapat menggunakan Pernyataan Kasus:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product