Come eseguo un'istruzione IF...THEN
in SQL SELECT
?
Per esempio:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
e CHECK
, ma non SELECT
.
Come eseguo un'istruzione IF...THEN
in SQL SELECT
?
Per esempio:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
e CHECK
, ma non SELECT
.
Risposte:
Il CASE
istruzione è la più vicina a IF in SQL ed è supportata su tutte le versioni di SQL Server.
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
Devi solo fare ciò CAST
se vuoi il risultato come valore booleano. Se sei soddisfatto di un int
, questo funziona:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
le istruzioni possono essere incorporate in altre CASE
istruzioni e persino incluse negli aggregati.
SQL Server Denali (SQL Server 2012) aggiunge l' istruzione IIF che è anche disponibile in accesso (sottolineato da Martin Smith ):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
L'affermazione del caso è tua amica in questa situazione e assume una delle due forme:
Il semplice caso:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Il caso esteso:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Puoi anche mettere le dichiarazioni dei casi in un ordine per clausola per un ordinamento davvero fantasioso.
AS Col_Name
dopo il END
dare un nome colonna risultante
Da SQL Server 2012 è possibile utilizzare la IIF
funzione per questo.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Questo è effettivamente solo un modo di scrivere abbreviato (anche se non standard SQL) CASE
.
Preferisco la concisione rispetto all'espanso CASE
versione .
Sia IIF()
e CASE
determinazione come espressioni all'interno di un'istruzione SQL e può essere utilizzato solo in luoghi ben definiti.
L'espressione CASE non può essere utilizzata per controllare il flusso di esecuzione di istruzioni Transact-SQL, blocchi di istruzioni, funzioni definite dall'utente e procedure memorizzate.
Se queste esigenze non possono essere soddisfatte da queste limitazioni (ad esempio, la necessità di restituire set di risultati di forma diversa in base a una condizione), anche SQL Server dispone di una IF
parola chiave procedurale .
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Puoi trovare alcuni begli esempi in The Power of SQL CASE Statements , e penso che l'affermazione che puoi usare sarà qualcosa del genere (da 4guysfromrolla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Caso d'uso. Qualcosa come questo.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Microsoft SQL Server (T-SQL)
In a select
, utilizzare:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
In una where
clausola, utilizzare:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'
e tagliare il punto a metà praticamente
Da questo link , possiamo capire IF THEN ELSE
in 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'
Non è abbastanza buono per T-SQL?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Istruzione if-else semplice in SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Istruzione nidificata If ... else in 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
come richiesto da OP?
Una nuova funzionalità, IIF (che possiamo semplicemente usare), è stata aggiunta in SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Usa logica bit pura:
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
Guarda la demo funzionante: se poi senza case
SQL Server .
Per iniziare, è necessario calcolare il valore di true
e false
per le condizioni selezionate. Ecco due NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
combinato insieme dà 1 o 0. Operatori bit per bit successivi .
È il metodo più 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
Questa non è una risposta, solo un esempio di una dichiarazione CASE in uso dove lavoro. Ha un'istruzione CASE nidificata. Ora sai perché i miei occhi sono incrociati.
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
diventare votato e contrassegnato come risposta anzichéIF
che quale avrebbe dovuto essere la risposta, come questa, questa è ancora CASE
un'affermazione, non una IF
.
Se stai inserendo i risultati in una tabella per la prima volta, anziché trasferirli da una tabella all'altra, questo funziona in 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');
Come soluzione alternativa a CASE
all'istruzione, è possibile utilizzare un approccio basato su tabella:
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
Risultato:
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
Per coloro che utilizzano SQL Server 2012, IIF è una funzionalità che è stata aggiunta e funziona in alternativa alle istruzioni 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
Puoi avere due scelte per implementarlo effettivamente:
Utilizzando IIF, che è stato introdotto da SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Utilizzando Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Domanda:
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;
L'uso degli alias - p
in questo caso - aiuterà a prevenire i problemi.
L'uso di SQL CASE è proprio come le normali istruzioni If / Else. Nella query seguente, se valore obsoleto = 'N' o se valore InStock = 'Y', l'output sarà 1. Altrimenti l'output sarà 0. Quindi inseriamo quel valore 0 o 1 nella colonna vendibile.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
If..Then...Else..
dichiarazioni utilizzano SQL
come segue ....
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Sarà qualcosa del genere:
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';
Per completezza, aggiungerei che SQL utilizza una logica a tre valori. L'espressione:
obsolete = 'N' OR instock = 'Y'
Potrebbe produrre tre risultati distinti:
| 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 |
Quindi, ad esempio, se un prodotto è obsoleto ma non sai se il prodotto è instock, non sai se il prodotto è vendibile. È possibile scrivere questa logica a tre valori come segue:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Una volta capito come funziona, puoi convertire tre risultati in due risultati decidendo il comportamento di null. Ad esempio, questo considererebbe null come non vendibile:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Mi piace l'uso delle istruzioni CASE ma la domanda posta per un'istruzione IF in SQL Select. Quello che ho usato in passato è stato:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
È come le istruzioni IF di Excel o fogli in cui esiste una condizione seguita dalla condizione vera e quindi dalla condizione falsa:
if(condition, true, false)
Inoltre, puoi annidare le istruzioni if (ma quindi usare dovrebbe usare un CASE :-)
(Nota: funziona in MySQLWorkbench ma potrebbe non funzionare in altre piattaforme)
È possibile utilizzare l'istruzione case:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product