IF...THENBir SQL SELECTifadede nasıl gerçekleştiririm ?
Örneğin:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREve CHECKancak SELECT.
IF...THENBir SQL SELECTifadede nasıl gerçekleştiririm ?
Örneğin:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREve CHECKancak 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 CASTsonucu 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
CASEifadeler diğer CASEifadelere 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_Namesonrası ekleyebileceğiniz belirtilmelidirEND
SQL Server 2012'den bunun için IIFiş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ş CASEversiyonla karşılaştırıldığında özlü olmayı tercih ederim .
Her ikisi de IIF()ve CASEbir 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 IFanahtar 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 wherecü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 ELSET-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
SELECTOP'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 trueve değerlerinin değerini falsehesaplamanı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]
CASEcevaplanıp yanıt olarak işaretlenmiş olarak cevaplanacağını geziyorum, IFbunun gibi, bu hala bir CASEifade 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, CASEtablo 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 ProductKullanma Select Case:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM ProductSoru:
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 - pbu 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