W jaki sposób wykonują IF...THENw SQL SELECTrachunku?
Na przykład:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREi CHECKnie dotyczy SELECT.
W jaki sposób wykonują IF...THENw SQL SELECTrachunku?
Na przykład:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREi CHECKnie dotyczy SELECT.
Odpowiedzi:
CASEOświadczenie znajduje się najbliżej IF w SQL i jest obsługiwany we wszystkich wersjach SQL Server.
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
Musisz zrobić tylko, CASTjeśli chcesz, aby wynik był wartością logiczną. Jeśli jesteś zadowolony z int, działa to:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASEinstrukcje mogą być osadzone w innych CASEinstrukcjach, a nawet zawarte w agregacjach.
SQL Server Denali (SQL Server 2012) dodaje instrukcję IIF , która jest również dostępna w trybie dostępu (wskazał Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
W tej sytuacji opis przypadku jest Twoim przyjacielem i przybiera jedną z dwóch form:
Prosty przypadek:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Rozszerzona sprawa:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Możesz nawet umieszczać instrukcje przypadków w kolejności według klauzuli, aby uzyskać naprawdę fantazyjne zamawianie.
AS Col_Namepo, ENDaby nazwać wynikową kolumnę
Od SQL Server 2012 możesz do tego użyć IIFfunkcji .
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Jest to faktycznie tylko krótszy (choć nie standardowy SQL) sposób pisania CASE.
Wolę zwięzłość w porównaniu z CASEwersją rozszerzoną .
Zarówno IIF()i CASEdeterminację jako wyrażenia w obrębie SQL i mogą być używane tylko w ściśle określonych miejscach.
Wyrażenia CASE nie można użyć do sterowania przepływem wykonywania instrukcji Transact-SQL, bloków instrukcji, funkcji zdefiniowanych przez użytkownika i procedur przechowywanych.
Jeśli te ograniczenia nie mogą zaspokoić twoich potrzeb (na przykład potrzeba zwrotu zestawów wyników o różnych kształtach, zależnych od niektórych warunków), wówczas SQL Server ma również IFsłowo kluczowe proceduralne .
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Możesz znaleźć kilka dobrych przykładów w Mocach instrukcji CASE SQL i myślę, że instrukcja, której możesz użyć, będzie mniej więcej taka (z 4guysfromrolla ):
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)
W select: użyj:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
W whereklauzuli użyj:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'i praktycznie
Z tego linku możemy zrozumieć IF THEN ELSEw 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'
Czy to nie wystarczy dla T-SQL?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Prosta instrukcja if-else w SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Instrukcja zagnieżdżona If ... else w 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
SELECTjak poprosił OP?
Nowa funkcja IIF (której możemy po prostu użyć) została dodana w SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Użyj czystej logiki bitowej:
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
Zobacz działające demo: jeśli nie, to casew SQL Server .
Na początek musisz obliczyć wartość truei falsedla wybranych warunków. Oto dwa NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
połączone razem dają 1 lub 0. Następnie użyj operatorów bitowych .
To najbardziej metoda 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
To nie jest odpowiedź, tylko przykład instrukcji CASE używanej tam, gdzie pracuję. Ma zagnieżdżoną instrukcję CASE. Teraz już wiesz, dlaczego mam skrzyżowane oczy.
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]
CASEzostałem uprzywilejowany i oznaczony jako odpowiedź zamiast odpowiedzi, IFktóra powinna być odpowiedzią, jak ta, to wciąż CASEstwierdzenie, a nie odpowiedź IF.
Jeśli wstawiasz wyniki do tabeli po raz pierwszy, zamiast przenosić wyniki z jednej tabeli do drugiej, działa to w 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');
Jako alternatywne rozwiązanie dla CASEinstrukcji można zastosować podejście oparte na tabeli:
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
Wynik:
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
Dla tych, którzy korzystają z SQL Server 2012, IIF to funkcja, która została dodana i działa jako alternatywa dla instrukcji Case.
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
W rzeczywistości można to zrobić na dwa sposoby:
Za pomocą IIF, który został wprowadzony z SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM ProductUżywanie Select Case:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM ProductPytanie:
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;
Użycie aliasów - pw tym przypadku - pomoże uniknąć problemów.
Korzystanie z instrukcji SQL CASE jest jak zwykłe instrukcje If / Else. W poniższym zapytaniu, Jeśli przestarzała wartość = „N” lub Jeśli wartość InStock = „Y”, Wynik wyniesie 1. W przeciwnym razie wynik wyniesie 0. Następnie umieścimy tę wartość 0 lub 1 w kolumnie 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
Będzie coś takiego:
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';
Dla kompletności dodam, że SQL używa logiki trójwartościowej. Ekspresja:
obsolete = 'N' OR instock = 'Y'
Może dać trzy różne wyniki:
| 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 |
Na przykład, jeśli produkt jest przestarzały, ale nie wiesz, czy produkt jest instock, nie wiesz, czy można go sprzedać. Możesz zapisać tę trójwartościową logikę w następujący sposób:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Po ustaleniu, jak to działa, możesz przekonwertować trzy wyniki na dwa, decydując o zachowaniu wartości null. Np. Traktowałoby to zero jako nie do sprzedaży:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Podoba mi się użycie instrukcji CASE, ale pytanie dotyczy instrukcji IF w SQL Select. W przeszłości korzystałem z:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
To jest jak instrukcje IF Excela lub arkusza, w których występuje warunek, po którym następuje warunek prawdziwy, a następnie warunek fałszywy:
if(condition, true, false)
Ponadto możesz zagnieżdżać instrukcje if (ale następnie użyj use CASE :-)
(Uwaga: działa to w MySQLWorkbench, ale może nie działać na innych platformach)
Możesz użyć instrukcji Case Case:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product