Bagaimana cara melakukan JIKA...MAKA
di sebuah SQL SELECT
pernyataan?
Misalnya:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
KASUS
pernyataan yang terdekat JIKA di SQL dan mendukung semua versi dari 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 ingin hasil sebagai nilai Boolean. Jika anda senang dengan int
, ini bekerja:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
KASUS
pernyataan dapat tertanam di lain KASUS
pernyataan dan bahkan termasuk dalam agregat.
SQL Server Denali (SQL Server 2012) menambahkan IIF pernyataan yang juga tersedia di akses (yang ditunjukkan oleh Martin Smith):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Laporan 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>
Diperpanjang kasus:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Anda bahkan dapat menempatkan laporan kasus dalam klausa order by untuk benar-benar mewah memesan.
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 hanya efektif singkatan (meskipun bukan standar SQL) cara penulisan KASUS
.
Saya lebih suka keringkasan bila dibandingkan dengan memperluas KASUS
versi.
Kedua IIF()
dan KASUS
menyelesaikan sebagai ekspresi dalam sebuah pernyataan SQL dan hanya dapat digunakan di tempat-tempat didefinisikan.
KASUS ekspresi tidak dapat digunakan untuk mengontrol aliran eksekusi pernyataan Transact-SQL, pernyataan blok, user-defined functions, dan prosedur yang tersimpan.
Jika kebutuhan anda tidak bisa puas dengan keterbatasan ini (misalnya, kebutuhan untuk kembali berbentuk berbeda hasil set tergantung pada beberapa kondisi) maka SQL Server juga memiliki prosedural JIKA
kata kunci.
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 SQL Laporan KASUS, 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
Microsoft SQL Server (T-SQL)
Dalam memilih
, gunakan:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Dalam where
, gunakan:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
Dari link ini, kita dapat memahami JIKA KEMUDIAN yang LAIN
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'
Isn't ini cukup baik untuk T-SQL?
Sederhana if-else pernyataan dalam SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Nested If...else pernyataan dalam 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
Gunakan pure bit logika:
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 bekerja: jika maka tanpa kasus
di SQL Server.
Untuk memulai, anda perlu untuk bekerja keluar nilai true
dan palsu
untuk kondisi yang dipilih. Di sinilah dua NULLIF:
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
digabungkan bersama-sama memberikan 1 atau 0. Berikutnya gunakan bitwise operator.
It's paling WYSIWYG metode.
Ini isn't jawaban, hanya sebuah contoh dari pernyataan KASUS di gunakan di mana saya bekerja. Itu telah bersarang pernyataan CASE. Sekarang anda tahu mengapa mata saya menyeberang.
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]
Jika anda're memasukkan hasil ke dalam tabel untuk pertama kalinya, bukan mentransfer hasil dari satu meja ke meja yang lain, ini bekerja di Oracle 11.2 g:
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 alternatif solusi untuk KASUS
pernyataan, meja-driven pendekatan yang 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
Hasilnya:
ID Obsolete InStock Saleable
----------- ---------- ---------- -----------
1 N Y 1
2 A B 0
3 N B 1
4 A Y 1