sentencia - ¿Cómo realizo un IF... LUEGO en un SQL SELECT?
sentencia select sql (24)
Como una solución alternativa a la tabla de sentencias CASE
, se puede utilizar el enfoque.
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
¿Cómo realizo un IF...THEN
en una SQL SELECT
?
Por ejemplo:
SELECT IF(Obsolete = ''N'' OR InStock = ''Y'' ? 1 : 0) AS Saleable, * FROM Product
Desde SQL Server 2012 puedes usar la función IIF
para esto.
SELECT IIF(Obsolete = ''N'' OR InStock = ''Y'', 1, 0) AS Salable, *
FROM Product
Esta es, de hecho, solo una forma abreviada (aunque no de SQL estándar) de escribir CASE
.
Prefiero la concisión en comparación con la versión CASE
ampliada.
Tanto IIF()
como CASE
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 usar para controlar el flujo de ejecución de las instrucciones Transact-SQL, los bloques de instrucciones, las funciones definidas por el usuario y los procedimientos almacenados.
Si sus necesidades 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 palabra clave IF
procedimiento.
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Desde este link , podemos entender si 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 suficientemente bueno para T-SQL?
Esto no es una respuesta, solo un ejemplo de una declaración CASE en uso donde trabajo. Tiene una sentencia 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]
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 casos en una cláusula de orden por pedido realmente elegante.
La sentencia CASE
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 necesitas hacer CAST
si quieres el resultado como un valor booleano, si estás contento con un int
, esto funciona:
SELECT CASE
WHEN Obsolete = ''N'' or InStock = ''Y''
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
declaraciones CASE
se pueden incrustar en otras declaraciones CASE
e incluso incluirse en agregados.
SQL Server Denali (SQL Server 2012) agrega la declaración IIF que también está disponible en el access : (señalado por Martin Smith )
SELECT IIF(Obsolete = ''N'' or InStock = ''Y'', 1, 0) as Saleable, * FROM Product
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, use:
where 1 = case when Obsolete = ''N'' or InStock = ''Y'' then 1 else 0 end
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
Pregunta ... SELECCIONAR SI (Obsoleto = ''N'' O InStock = ''Y''? 1: 0) COMO Venta, * DE Producto
ANSI: seleccione el caso cuando p.Obsolete = ''N'' o p.InStock = ''Y'' luego 1 else 0 finaliza como vendible, p. * FROM Producto p;
El uso de alias, p en este caso, ayudará a prevenir problemas.
Puedes encontrar algunos buenos ejemplos en The Power of SQL CASE Statements , y creo que la declaración que puedes 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
SELECCIONAR CAST (CASO CUANDO Obsoleto = ''N'' o InStock = ''Y'' ENTONCES A OTRA PARTE 0 FIN COMO bit) como vendible, * DE Producto
Sencilla sentencia if-else en SQL Server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT ''Hi Ravi Anand'';
ELSE
PRINT ''By Ravi Anand.'';
GO
Declaración anidada If ... else en el servidor SQL
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
Si está insertando los resultados en una tabla por primera vez, en lugar de transferir los 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'');
Una nueva característica, IIF (que podemos usar simplemente), se agregó en SQL Server 2012:
SELECT IIF ( (Obsolete = ''N'' OR InStock = ''Y''), 1, 0) AS Saleable, * FROM Product
Utilice CASE. Algo como esto.
SELECT Salable =
CASE Obsolete
WHEN ''N'' THEN 1
ELSE 0
END
Utilice la lógica de bits 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
Ver demostración de trabajo: SI ENTONCES SIN CASO EN MSSQL
Para empezar, debe calcular el valor de true
y false
para las condiciones seleccionadas. Aquí viene dos NULLIF :
for true: ISNULL(NULLIF(p.[Instock], ''Y''), 1)
for false: ISNULL(NULLIF(p.[Instock], ''N''), 0)
combinados da 1 o 0. A continuación, utilice operadores bitwise .
Es el método más WYSIWYG .
Utilice una sentencia CASE:
SELECT CASE
WHEN (Obsolete = ''N'' OR InStock = ''Y'')
THEN ''Y''
ELSE ''N''
END as Available
etc...
SELECT IIF(Obsolete = ''N'' OR InStock = ''Y'',1,0) AS Saleable, * FROM Product
SELECT
CASE
WHEN OBSOLETE = ''N'' or InStock = ''Y'' THEN ''TRUE''
ELSE ''FALSE''
END AS Salable,
*
FROM PRODUCT
SELECT
(CASE
WHEN (Obsolete = ''N'' OR InStock = ''Y'') THEN ''YES''
ELSE ''NO''
END) as Salable
, *
FROM Product
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 Obsolete = ''N'' or InStock = ''Y'' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
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