sentencia - sintaxis select sql




¿Cómo realizo un IF... LUEGO en un SQL SELECT? (16)

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 

En ocasiones, se debe tener cuidado para evitar problemas con la detección de parámetros con este enfoque.


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.


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 

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


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 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
   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 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