¿Cómo realizo un IF...THEN en un SQL SELECT?
¿ Cómo realizo IF...THEN
una SQL SELECT
declaración?
Por ejemplo:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
La CASE
declaració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 CAST
operador 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
CASE
Las declaraciones pueden integrarse en otras CASE
declaraciones 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
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.
Desde SQL Server 2012 puedes utilizar la IIF
funció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 CASE
versión ampliada.
Ambos IIF()
y CASE
se 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 IF
palabra 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 .
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