w3schools - sql server when or




Como faço para executar um IF... ENTÃO em um SQL SELECT? (16)

Como faço para executar um IF...THEN em uma SQL SELECT ?

Por exemplo:

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

A declaração do caso é sua amiga nessa situação e assume uma das 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 estendido:

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

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


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

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ê quiser o resultado como um valor booleano, se você está feliz com um int , isso funciona:

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

CASE instruções CASE podem ser incorporadas em outras instruções CASE e até incluídas em agregados.

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

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

Como uma solução alternativa para a abordagem orientada por tabela de instruções CASE pode ser usada.

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

Do SQL Server 2012, você pode usar a função IIF para isso.

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

Esta é efetivamente uma maneira abreviada (embora não padrão SQL) de escrever CASE .

Eu prefiro a concisão quando comparado com a versão expandida do CASE .

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

A expressão CASE não pode ser usada para controlar o fluxo de execução de instruções Transact-SQL, blocos de instruções, funções definidas pelo usuário e procedimentos armazenados.

Se suas necessidades não puderem ser satisfeitas por essas limitações (por exemplo, a necessidade de retornar conjuntos de resultados de formas diferentes dependendo de alguma condição), o SQL Server também terá uma IF chave IF processual.

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

Às vezes, é preciso tomar cuidado para evitar problemas de sniffing de parâmetro com essa abordagem.


Isso não é uma resposta, apenas um exemplo de uma instrução CASE em uso onde eu trabalho. Tem uma instrução CASE aninhada. Agora você sabe porque 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]

Microsoft SQL Server (T-SQL)

Em um uso selecionado:

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

Em uma cláusula where, use:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end

Pergunta ... SELECIONAR SE (Obsoleto = 'N' OU InStock = 'Y'? 1: 0) AS Vendível, * FROM Produto

ANSI: Selecione o caso quando p.Obsolete = 'N' ou p.InStock = 'Y', em seguida, 1 mais 0 final como Salable, p. * FROM Product p;

O uso de aliases - p neste caso - ajudará a evitar problemas.


SELECT CAST (CASO QUANDO Obsoleto = 'N' ou InStock = 'Y' ENTÃO ELSE 0 FIM COMO bit) como Vendível, * FROM Product


Um novo recurso, o IIF (que podemos simplesmente usar), foi adicionado no SQL Server 2012:

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

Use CASE. Algo assim.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END

Use uma instrução CASE:

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

etc...

Você pode encontrar alguns bons exemplos no Power of SQL CASE Statements , e acho que a afirmação que você pode usar será algo como isto (de 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 1 ELSE 0 
             END AS Saleable, * 
FROM Product

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

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




case