Come eseguo un'istruzione IF...THENin SQL SELECT?
Per esempio:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREe CHECK, ma non SELECT.
Come eseguo un'istruzione IF...THENin SQL SELECT?
Per esempio:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHEREe 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ò CASTse 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
CASEle istruzioni possono essere incorporate in altre CASEistruzioni 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_Namedopo il ENDdare un nome colonna risultante
Da SQL Server 2012 è possibile utilizzare la IIFfunzione 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 CASEdeterminazione 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 IFparola 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 whereclausola, 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 ELSEin 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
SELECTcome 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 caseSQL Server .
Per iniziare, è necessario calcolare il valore di truee falseper 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]
CASEdiventare votato e contrassegnato come risposta anzichéIF che quale avrebbe dovuto essere la risposta, come questa, questa è ancora CASEun'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 ProductUtilizzando Select Case:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM ProductDomanda:
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 - pin 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 SQLcome 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