Pregunta ¿Cómo realizo un IF ... THEN en un SQL SELECT?


¿Cómo realizo un IF...THEN en una SQL SELECT ¿declaración?

Por ejemplo:

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

1221
2017-09-15 14:34


origen


Respuestas:


los CASE declaración es lo más cercano a IF en SQL y es compatible con todas las versiones de SQL Server

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

Solo necesitas hacer CAST si desea el resultado como un valor booleano, si está satisfecho con un int, esto funciona:

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

CASE las declaraciones se pueden incrustar en otra CASE declaraciones e incluso incluidas en los agregados.

SQL Server Denali (SQL Server 2012) agrega el IIF declaración que también está disponible en acceso: (señalado por Martin Smith)

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

1457
2017-09-15 14:38



La declaración del caso es su amigo en esta situación, y toma una de dos formas:

El caso simple:

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

El caso extendido:

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

Incluso puede colocar declaraciones de casos en una cláusula order by para obtener un orden realmente elegante.


282
2017-09-15 15:10



Desde SQL Server 2012 puede usar el IIF función para esto.

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

Esto es solo una forma abreviada (aunque no es un SQL estándar) de escribir CASE.

Prefiero la concisión cuando se compara con la expansión CASE versión.

Ambos IIF() y CASE resolver como expresiones dentro de una declaración de SQL y solo se puede usar en lugares bien definidos.

La expresión CASE no se puede usar para controlar el flujo de ejecución de   Instrucciones Transact-SQL, bloques de instrucciones, funciones definidas por el usuario y   procedimientos almacenados.

Si sus necesidades no pueden ser satisfechas por estas limitaciones (por ejemplo, la necesidad de devolver conjuntos de resultados con formas diferentes que dependan de alguna condición), entonces SQL Server también tiene un procedimiento IF Palabra clave.

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

Sin embargo, a veces se debe tener cuidado para evitar problemas de detección de parámetros con este enfoque.


213
2017-07-20 23:39



Puedes encontrar algunos buenos ejemplos en El poder de las sentencias de SQL CASE, y creo que la declaración que puede usar será algo como esto (de 4guysfromrolla)

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees

74
2017-09-15 14:39



Use CASE. Algo como esto.

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

68
2017-09-15 14:37



SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product

42
2017-09-15 14:37



 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

37
2017-09-15 14:37



Microsoft SQL Server (T-SQL)

En un uso selecto:

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

En una cláusula where, usa:

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

35
2017-09-15 14:40