it-swarm-pt.tech

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

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

Por exemplo:

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

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

As 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 instrução IIF que também está disponível em access : (apontada por Martin Smith )

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

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 instruções de caso em uma ordem por cláusula para encomendar realmente extravagante.

301
Jonathan

No 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 

Isto é efetivamente apenas uma forma abreviada (embora não padrão SQL) de escrever CASE

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

Tanto IIF() quanto CASE resolvem como expressões dentro de uma instrução SQL e podem ser usadas apenas 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 palavra-chave procedural IF .

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, deve-se tomar cuidado para evitar problemas de detecção de parâmetros com essa abordagem

236
Martin Smith

Você pode encontrar alguns bons exemplos em O Poder das Instruções SQL CASE, e eu acho que a declaraçã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
81
sven

Use CASE. Algo assim.

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

A partir deste link , podemos entender 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' 

Isso não é bom o suficiente para o T-SQL?

41
Ken

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
40
user7658

Instrução if-else simples no SQL Server:

DECLARE @val INT;
SET @val = 15;

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

GO

Aninhado se ... outra instrução no 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

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

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

Use lógica de 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

Veja demo de trabalho: SE ENTÃO SEM CASO EM MSSQL

Para começar, você precisa calcular o valor de true e false para as condições selecionadas. Aqui vem dois NULLIF :

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

combinados juntos dão 1 ou 0. Próximo uso operadores bitwise .

É o método mais WYSIWYG .

23
Tomasito

Use uma instrução 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

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]
12
JustJohn

Se você estiver inserindo resultados em uma tabela pela primeira vez, em vez de transferir resultados de uma tabela para outra, isso funciona no 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
Robert B. Grossman

Como uma solução alternativa para a abordagem baseada na 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
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
SURJEET SINGH Bisht

Para quem usa o SQL Server 2012, o IIF é um recurso que foi adicionado e funciona como uma alternativa às instruções Case.

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

SELECIONAR CAST (CASO QUANDO Obsoleto = 'N' ou InStock = 'Y' ENTÃO ELSE 0 FAZER AS bits) como Vendível, * FROM Product

0
gii96

Você pode ter duas opções para isso implementar:

1) Usando o IIF, que foi introduzido do SQL 2012:

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

2) Usando o Select Case:

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

Pergunta ... SELECIONAR SE (Obsoleto = 'N' OR InStock = 'S'? 1: 0) AS Vendable, * 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.

0
David Cohn