¿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
WHERE
y CHECK
no 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
WHERE
y CHECK
no SELECT
.
Respuestas:
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
Solo necesita hacer esto CAST
si quiere 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 otras CASE
declaraciones e incluso se pueden incluir en agregados.
SQL Server Denali (SQL Server 2012) agrega la declaración IIF 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
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 poner declaraciones de caso en un orden por cláusula para un pedido realmente elegante.
AS Col_Name
después del END
para nombrar la columna resultante
Desde SQL Server 2012 puede usar la IIF
función para esto.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Esto es efectivamente solo una forma abreviada (aunque no estándar de SQL) de escritura CASE
.
Prefiero la concisión en comparación con la CASE
versión ampliada .
Tanto IIF()
y CASE
determinación como expresiones dentro de una instrucción SQL y sólo puede ser utilizado 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 satisfacerse con estas limitaciones (por ejemplo, la necesidad de devolver conjuntos de resultados con formas diferentes que dependen de alguna condición), entonces 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
Puede encontrar algunos buenos ejemplos en The Power of SQL CASE Statements , 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
Use CASE. Algo como esto.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Microsoft SQL Server (T-SQL)
En a select
, use:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
En una where
cláusula, use:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
where Obsolete = 'N' or InStock = 'Y'
y cortarías el por la mitad prácticamente?
Desde este enlace , podemos entender IF THEN ELSE
en 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'
¿No es esto lo suficientemente bueno para T-SQL?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Declaración simple if-else en SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Sentencia anidada If ... else en 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
SELECT
como OP preguntó?
Se agregó una nueva característica, IIF (que simplemente podemos usar), en SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Use lógica de bit puro:
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
Ver demostración de trabajo: si es así sin case
SQL Server .
Para comenzar, debe calcular el valor de true
y false
para las condiciones seleccionadas. Aquí vienen dos NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
combinados juntos da 1 o 0. Siguiente uso de operadores bit a bit .
Es el método más WYSIWYG .
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' )
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
Esta no es una respuesta, solo un ejemplo de una declaración CASE en uso donde trabajo. Tiene una declaración CASE anidada. Ahora sabes por qué mis ojos están 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]
CASE
ser votado y marcado como una respuesta en lugar de la IF
que debería haber sido la respuesta, como esta, esta sigue siendo una CASE
declaración, no una IF
.
Si está insertando resultados en una tabla por primera vez, en lugar de transferir resultados de una tabla a otra, esto funciona en 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');
Como una solución alternativa a la CASE
declaración, se puede utilizar un enfoque basado en tablas:
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
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
Para aquellos que usan SQL Server 2012, IIF es una característica que se ha agregado y funciona como una alternativa a las declaraciones de casos.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
Puede tener dos opciones para implementar esto realmente:
Usando IIF, que se introdujo desde SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Utilizando Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Pregunta:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
El uso de alias, p
en este caso, ayudará a prevenir problemas.
Usar SQL CASE es como las declaraciones normales If / Else. En la consulta a continuación, si el valor es obsoleto = 'N' o si el valor de InStock = 'Y', la salida será 1. De lo contrario, la salida será 0. Luego colocamos ese valor 0 o 1 debajo de la columna vendible.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Será algo así:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
En aras de la exhaustividad, agregaría que SQL utiliza la lógica de tres valores. La expresion:
obsolete = 'N' OR instock = 'Y'
Podría producir tres resultados distintos:
| obsolete | instock | saleable |
|----------|---------|----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
Entonces, por ejemplo, si un producto es obsoleto pero no sabe si el producto es instock, entonces no sabe si el producto es vendible. Puede escribir esta lógica de tres valores de la siguiente manera:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Una vez que descubra cómo funciona, puede convertir tres resultados en dos resultados al decidir el comportamiento de nulo. Por ejemplo, esto trataría nulo como no vendible:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Me gusta el uso de las declaraciones CASE pero la pregunta solicitó una declaración IF en SQL Select. Lo que he usado en el pasado ha sido:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
Es como las declaraciones IF de Excel o de hojas donde hay un condicional seguido de la condición verdadera y luego la condición falsa:
if(condition, true, false)
Además, puede anidar las declaraciones if (pero luego use debería usar un CASE :-)
(Nota: esto funciona en MySQLWorkbench pero puede no funcionar en otras plataformas)
Puede usar la Declaración de caso:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product