IF...THEN
Bir SQL SELECT
ifadede nasıl gerçekleştiririm ?
Örneğin:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
ve CHECK
ancak SELECT
.
IF...THEN
Bir SQL SELECT
ifadede nasıl gerçekleştiririm ?
Örneğin:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
ve CHECK
ancak SELECT
.
Yanıtlar:
CASE
İfadesi SQL IF en yakın olan ve SQL Server'ın tüm sürümlerinde desteklenir.
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
Yalnızca CAST
sonucu Boole değeri olarak istiyorsanız yapmalısınız . Birinden memnunsanız int
, bu işe yarar:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
ifadeler diğer CASE
ifadelere gömülebilir ve hatta kümelere dahil edilebilir.
SQL Server Denali (SQL Server 2012) , erişimde de bulunan ( Martin Smith tarafından işaret edilen ) IIF ifadesini ekler :
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Vaka bildirimi bu durumda arkadaşınızdır ve iki formdan birini alır:
Basit durum:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Genişletilmiş dava:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Vaka ifadelerini gerçekten süslü sipariş için maddeye göre bir sıraya koyabilirsiniz.
AS Col_Name
sonrası ekleyebileceğiniz belirtilmelidirEND
SQL Server 2012'den bunun için IIF
işlevi kullanabilirsiniz .
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Bu etkili bir şekilde sadece steno (standart SQL olmasa da) bir yazma şeklidir CASE
.
Genişletilmiş CASE
versiyonla karşılaştırıldığında özlü olmayı tercih ederim .
Her ikisi de IIF()
ve CASE
bir SQL deyimi içinde ifadeler olarak çözümlenir ve yalnızca iyi tanımlanmış yerlerde kullanılabilir.
CASE ifadesi, Transact-SQL deyimlerinin, deyim bloklarının, kullanıcı tanımlı işlevlerin ve saklı yordamların yürütme akışını denetlemek için kullanılamaz.
İhtiyaçlarınız bu sınırlamalardan (örneğin, bazı koşullara bağlı olarak farklı şekilli sonuç kümelerini döndürme ihtiyacı) karşılanamıyorsa, SQL Server'ın yordamsal bir IF
anahtar sözcüğü de vardır.
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Bununla birlikte, bazen bu yaklaşımla parametre koklama sorunlarından kaçınmaya dikkat edilmelidir .
SQL CASE'in İfadelerinin Gücü'nde bazı güzel örnekler bulabilirsiniz ve kullanabileceğiniz ifadenin ( 4guysfromrolla'dan ) böyle bir şey olacağını düşünüyorum :
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Microsoft SQL Server (T-SQL)
A'da select
şunları kullanın:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Bir where
cümlede şunu kullanın:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'
pratikte nerede yarı yarıya kesip yapmıyorsun
Gönderen bu bağlantıyı , biz anlayabiliriz IF THEN ELSE
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'
Bu T-SQL için yeterince iyi değil mi?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
SQL Server'da basit if-else deyimi:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
SQL Server'da iç içe If ... else deyimi -
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
OP'nin istediği gibi içeride kullanılabilir mi?
SQL Server 2012'de yeni bir özellik olan IIF (yalnızca kullanabileceğimiz) eklendi:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Saf bit mantığı kullanın:
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
Çalışma demosunacase
bakın : SQL Server'da yoksa .
Başlangıç için, seçilen koşulların true
ve değerlerinin değerini false
hesaplamanız gerekir. İki NULLIF geliyor :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
bir araya geldiğinde 1 veya 0 verir. Bir sonraki kullanım bitsel operatörler .
Bu en çok WYSIWYG yöntemidir.
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
Bu bir cevap değil, sadece çalıştığım yerde kullanılan bir CASE ifadesi örneği. İç içe bir CASE deyimi vardır. Şimdi gözlerimin neden çapraz olduğunu biliyorsun.
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
cevaplanıp yanıt olarak işaretlenmiş olarak cevaplanacağını geziyorum, IF
bunun gibi, bu hala bir CASE
ifade değil, bir ifadedir IF
.
Sonuçları bir tablodan diğerine aktarmak yerine sonuçları bir tabloya ilk kez ekliyorsanız, bu Oracle 11.2g'de çalışır:
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');
İfadeye alternatif bir çözüm olarak, CASE
tablo odaklı bir yaklaşım kullanılabilir:
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
Sonuç:
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
SQL Server 2012 kullananlar için IIF, Eklenen ve Case ifadelerine alternatif olarak çalışan bir özelliktir.
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
Bunun gerçekte uygulanması için iki seçeneğiniz olabilir:
SQL Server 2012'den tanıtılan IIF'yi kullanarak:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Kullanma Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Soru:
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;
Takma ad kullanmak - p
bu durumda - sorunların önlenmesine yardımcı olacaktır.
SQL CASE kullanmak normal If / Else ifadeleri gibidir. Aşağıdaki sorguda, eski değer = 'N' veya InStock değeri = 'Y' ise Çıkış 1 olacaktır.
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
Böyle bir şey olacak:
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';
Tamlık uğruna, SQL'in üç değerli mantık kullandığını ekleyebilirim. İfade:
obsolete = 'N' OR instock = 'Y'
Üç farklı sonuç verebilir:
| 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 |
Yani örneğin bir ürün kullanılmıyorsa ancak ürünün stokta olup olmadığını bilmiyorsanız, ürünün satılabilir olup olmadığını bilmiyorsunuzdur. Bu üç değerli mantığı aşağıdaki gibi yazabilirsiniz:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Nasıl çalıştığını anladıktan sonra, null davranışına karar vererek üç sonucu iki sonuca dönüştürebilirsiniz. Örneğin, bu null değeri satılamaz olarak görür:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
CASE deyimlerinin kullanımını seviyorum ama soru SQL Select bir IF deyimi istedi. Geçmişte kullandığım şey:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
Bir koşul ve ardından doğru koşul ve sonra yanlış koşul varsa excel veya sayfalar IF ifadeleri gibidir:
if(condition, true, false)
Ayrıca, if ifadelerini iç içe yerleştirebilirsiniz (ancak daha sonra kullanım bir CASE kullanmalıdır :-)
(Not: Bu MySQLWorkbench'te çalışır, ancak diğer platformlarda çalışmayabilir)
Vaka Bildirimi'ni kullanabilirsiniz:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product