Como faço para executar um se...então em uma seleção SQL?

Como faço para executar um IF...THEN numa declaração SQL SELECT?

por exemplo:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Author: DineshDB, 2008-09-15

23 answers

A instrução CASE é a mais próxima de IF em SQL e é suportada em todas as versões do servidor SQL

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

Você só precisa fazer o CAST se você quer o resultado como um valor booleano, se você está feliz com um int, isto funciona:

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

CASE As declarações podem ser incorporadas noutras declarações CASE e mesmo incluídas em agregados.

SQL Server Denali (SQL Server 2012) adiciona a declaração IIF que também está disponível em access : (indicado por Martin Smith)

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
 1487
Author: Darrel Miller, 2017-05-23 11:55:01

A declaração do caso é tua amiga nesta situação, e assume uma de duas formas:

O caso simples:

SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                       WHEN <othervalue> THEN <returnthis>
                                         ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

O caso alargado:

SELECT CASE WHEN <test>      THEN <returnvalue>
            WHEN <othertest> THEN <returnthis>
                             ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

Você pode até colocar declarações de caso em uma ordem por cláusula para pedidos realmente extravagantes.

 289
Author: Jonathan, 2015-10-28 00:07:31

A partir do SQL Server 2012 você pode usar o IIF função para isto.

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

Esta é efectivamente apenas uma forma abreviada (embora não padrão SQL) de escrita CASE.

Prefiro a concisão quando comparada com a versão expandida CASE.

Ambos IIF() e CASE resolvem como expressões dentro de uma declaração SQL e só podem ser usados em locais bem definidos.

A expressão do caso não pode ser usada para controlar o fluxo de execução Declarações Transact-SQL, blocos de declarações, funções definidas pelo utilizador, e procedimento.

Se as suas necessidades não podem ser satisfeitas por estas limitações (por exemplo, uma necessidade de retornar conjuntos de resultados de forma diferente depende de alguma condição) então o servidor SQL também tem um procedimento IF palavra-chave.

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

No entanto, é necessário ter cuidado para evitar que os parâmetros detectem problemas com esta abordagem.

 220
Author: Martin Smith, 2017-04-13 12:42:36

Você pode encontrar alguns bons exemplos em o poder das declarações de caso SQL, e eu acho que a declaração que você pode usar será algo assim (de 4guysfromrolla):

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
 77
Author: sven, 2011-05-24 17:31:26

Caso de Utilização. Algo assim.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
 71
Author: palehorse, 2008-09-15 14:37:49
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
 44
Author: John Sheehan, 2012-03-29 12:36:04
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
 41
Author: Santiago Cepas, 2008-09-15 14:37:56

Microsoft SQL Server (T-SQL)

Numa selecção de Utilização:

select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end

Numa cláusula where, utilizar:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
 38
Author: user7658, 2008-09-15 14:40:04

A partir deste link , podemos uderstand IF THEN ELSE em 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' 
Isto não é bom o suficiente para o T-SQL ?
 38
Author: Ken, 2015-11-24 09:31:19

Simples declaração if-else no servidor SQL:

DECLARE @val INT;
SET @val = 15;

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

GO

Aninhado Se...Else statement 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
 28
Author: Ravi Anand, 2017-05-21 10:55:36

Uma nova funcionalidade, IIF (que podemos simplesmente usar), foi adicionada no servidor SQL 2012:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
 22
Author: sandeep rawat, 2017-09-30 00:12:39

Usar uma instrução de caso:

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

etc...
 21
Author: Krizzy, 2016-11-04 12:45:14

Usar a lógica dos bits puros:

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

Ver demonstração de trabalho: se então sem o caso no MSSQL

Para o início, é necessário determinar o valor de true e false para as condições seleccionadas. Aí vem dois.:

for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

Juntos dá 1 ou 0. Próxima utilização operadores bitwise .

É o método mais WYSIWYG.

 21
Author: Tomasito, 2017-05-21 10:56:17
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' )
 16
Author: onedaywhen, 2016-05-11 15:56:30
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
 14
Author: atik sarker, 2015-08-25 09:44:46
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
 12
Author: Chanukya, 2015-12-09 12:15:36
Isto não é uma resposta, é apenas um exemplo de um caso em uso onde trabalho. Tem uma declaração de caso aninhado. Agora sabes porque os meus olhos estão cruzados.
 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]
 11
Author: JustJohn, 2016-10-11 08:00:39

Se você está inserindo resultados em uma tabela pela primeira vez, em vez de transferir resultados de uma tabela para outra, isso funciona em Oracle 11.2 g:

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');
 10
Author: Robert B. Grossman, 2012-10-26 15:30:18
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
 7
Author: SURJEET SINGH Bisht, 2016-11-30 11:05:06

Para aqueles que usam o SQL Server 2012, o IIF é um recurso que foi adicionado e funciona como uma alternativa às declarações de casos.

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
 6
Author: Dibin, 2014-04-07 14:16:17
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
 5
Author: , 2017-08-08 21:33:52

Como solução alternativa à abordagem baseada na tabela de declarações CASE pode ser utilizada.

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 

Resultado:

ID          Obsolete   InStock    Saleable
----------- ---------- ---------- -----------
1           N          Y          1
2           A          B          0
3           N          B          1
4           A          Y          1
 5
Author: Serkan Arslan, 2018-01-31 11:31:07

Seleccionar o elenco (caso quando obsoleto = ' N 'ou InStock =' Y ' e depois 0 terminar como bit) como vendável, * do Produto

 0
Author: gii96, 2018-10-08 06:34:01