it-swarm-eu.dev

Come si esegue un IF ... THEN in un SQL SELECT?

Come eseguo un IF...THEN in una dichiarazione SQL SELECT?

Per esempio:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
1367
Eric Labashosky

L'istruzione CASE è 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

Hai solo bisogno di CAST se vuoi che il risultato sia un 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

Le istruzioni CASE possono essere incorporate in altre istruzioni CASE e persino incluse negli aggregati. 

SQL Server Denali (SQL Server 2012) aggiunge l'istruzione IIF che è anche disponibile in access : (indicato da Martin Smith )

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
1570
Darrel Miller

La dichiarazione del caso è tua amica in questa situazione e prende una delle due forme seguenti:

Il caso semplice:

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 ordinazioni davvero fantasiose.

301
Jonathan

Da SQL Server 2012 è possibile utilizzare la funzione IIF per questo.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 

Questo è in effetti solo un modo stenografico (anche se non standard SQL) di scrivere CASE

Preferisco la concisione rispetto alla versione CASE espansa.

Sia IIF() che CASE si risolvono come espressioni all'interno di un'istruzione SQL e possono essere utilizzate 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 procedura di archiviazione.

Se le tue esigenze non possono essere soddisfatte da queste limitazioni (ad esempio la necessità di restituire set di risultati di forma diversa a seconda delle condizioni), SQL Server ha anche una parola chiave procedurale IF .

IF @IncludeExtendedInformation = 1 
  BEGIN 
      SELECT A,B,C,X,Y,Z 
      FROM   T 
  END 
ELSE 
  BEGIN 
      SELECT A,B,C 
      FROM   T 
  END 

A volte bisogna prestare attenzione per evitare problemi di snifing dei parametri con questo approccio.

236
Martin Smith

Puoi trovare alcuni esempi in The Power of SQL CASE Statements, e penso che la frase 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
81
sven

Caso d'uso. Qualcosa come questo.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
73
palehorse
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
46
John Sheehan
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
43
Santiago Cepas

Da questo link , possiamo uderstand 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?

41
Ken

Semplice istruzione if-else in SQL Server:

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';

GO

Nested If ... else istruzione 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
29
Ravi Anand

Una nuova funzione, IIF (che possiamo semplicemente utilizzare), è stata aggiunta in SQL Server 2012:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
23
sandeep rawat

Usa pura logica di bit:

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

Vedi demo di lavoro: SE POI SENZA CASO IN MSSQL

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)

combinati insieme dà 1 o 0. Avanti usa operatori bit per bit .

È il metodo più WYSIWYG .

23
Tomasito

Usa una dichiarazione CASE:

SELECT CASE
       WHEN (Obsolete = 'N' OR InStock = 'Y')
       THEN 'Y'
       ELSE 'N'
END as Available

etc...
22
Christopher
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' )
18
onedaywhen
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
15
atik sarker
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
13
Chanukya

Questa non è una risposta, solo un esempio di una dichiarazione CASE in uso dove lavoro. Ha una dichiarazione CASE annidata. 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]
12
JustJohn

Se si inseriscono risultati in una tabella per la prima volta, anziché trasferire i risultati da una tabella a un'altra, ciò 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');
11

Come soluzione alternativa all'approccio basato sulla tabella di istruzioni CASE può essere utilizzato.

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
9
Serkan Arslan
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
8
user8422856
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
6

Per coloro che utilizzano SQL Server 2012, IIF è una funzionalità che è stata aggiunta e funziona come alternativa alle istruzioni Case.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
5
Dibin

SELECT CAST (CASE WHEN Obsolete = 'N' o InStock = 'Y' THEN ELSE 0 END AS bit) as Salable, * FROM Product

0
gii96

È possibile avere due opzioni per implementare effettivamente:

1) Utilizzo di IIF, che è stato introdotto da SQL 2012:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product

2) Utilizzo di Select Case:

SELECT CASE 
    WHEN Obsolete = 'N' or InStock = 'Y' 
        THEN 1 
        ELSE 0 
    END as Saleable, * 
    FROM Product
0
Shivi

Domanda ... SELEZIONA IF (Obsolete = 'N' OR InStock = 'Y'? 1: 0) AS Salable, * FROM Product

ANSI: Seleziona caso quando p.Obsolete = 'N' o p.InStock = 'Y', quindi 1 altro 0 termina come Salable, p. * FROM Product p;

Utilizzando alias - p in questo caso - aiuterà a prevenire problemi.

0
David Cohn