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

Resuelto Eric Labashosky asked hace 16 años • 30 respuestas

¿ Cómo realizo IF...THENuna SQL SELECTdeclaración?

Por ejemplo:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Eric Labashosky avatar Sep 15 '08 21:09 Eric Labashosky
Aceptado

La CASEdeclaración es la más cercana 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

Sólo necesita utilizar el CASToperador si desea que el resultado sea un valor booleano. Si estás satisfecho con un int, esto funciona:

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

CASELas declaraciones pueden integrarse en otras CASEdeclaraciones e incluso incluirse en agregados.

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

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Darrel Miller avatar Sep 15 '2008 14:09 Darrel Miller

La declaración del caso es tu amiga en esta situación y toma una de dos formas:

El caso sencillo:

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 puedes poner declaraciones de casos en una cláusula de orden por para lograr un orden realmente elegante.

Jonathan avatar Sep 15 '2008 15:09 Jonathan

Desde SQL Server 2012 puedes utilizar la IIFfunción para esto.

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

En realidad, esta es solo una forma abreviada (aunque no SQL estándar) de escribir CASE.

Prefiero la concisión en comparación con la CASEversión ampliada.

Ambos IIF()y CASEse resuelven como expresiones dentro de una declaración SQL y solo se pueden usar en lugares bien definidos.

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

Si estas limitaciones no pueden satisfacer sus necesidades (por ejemplo, la necesidad de devolver conjuntos de resultados con formas diferentes dependiendo de alguna condición), SQL Server también tiene una IFpalabra clave de procedimiento.

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 .

Martin Smith avatar Jul 20 '2011 23:07 Martin Smith

Puede encontrar algunos buenos ejemplos en El poder de las declaraciones CASE de SQL , 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
sven avatar Sep 15 '2008 14:09 sven