W jaki sposób wykonują IF...THEN
w SQL SELECT
rachunku?
Na przykład:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
i CHECK
nie dotyczy SELECT
.
W jaki sposób wykonują IF...THEN
w SQL SELECT
rachunku?
Na przykład:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
i CHECK
nie dotyczy SELECT
.
Odpowiedzi:
CASE
Oś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, CAST
jeś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
CASE
instrukcje mogą być osadzone w innych CASE
instrukcjach, 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_Name
po, END
aby nazwać wynikową kolumnę
Od SQL Server 2012 możesz do tego użyć IIF
funkcji .
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 CASE
wersją rozszerzoną .
Zarówno IIF()
i CASE
determinację 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ż IF
sł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 where
klauzuli 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 ELSE
w 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
SELECT
jak 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 case
w SQL Server .
Na początek musisz obliczyć wartość true
i false
dla 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]
CASE
zostałem uprzywilejowany i oznaczony jako odpowiedź zamiast odpowiedzi, IF
która powinna być odpowiedzią, jak ta, to wciąż CASE
stwierdzenie, 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 CASE
instrukcji 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 Product
Używanie Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Pytanie:
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 - p
w 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