Buscar..


Introducción

La expresión CASE se utiliza para implementar la lógica if-then.

Sintaxis

  • CASE input_expression
    CUÁNDO comparar1 ENTONCES resultado1
    [CUANDO compare2 ENTONCES result2] ...
    [ELSE resultx]
    FIN
  • CASO
    CUANDO condiciona1 ENTONCES resultado1
    [CUANDO condicion2 LUEGO result2] ...
    [ELSE resultx]
    FIN

Observaciones

La expresión CASE simple devuelve el primer resultado cuyo valor compareX es igual a input_expression .

La expresión CASE buscada devuelve el primer resultado cuya conditionX X es verdadera.

CASO buscado en SELECCIONAR (coincide con una expresión booleana)

El CASE buscado devuelve resultados cuando una expresión booleana es VERDADERA.

(Esto difiere del caso simple, que solo puede verificar la equivalencia con una entrada).

SELECT Id, ItemId, Price,
  CASE WHEN Price < 10 THEN 'CHEAP'
       WHEN Price < 20 THEN 'AFFORDABLE'
       ELSE 'EXPENSIVE'
  END AS PriceRating
FROM ItemSales
Carné de identidad Identificación del artículo Precio Precio
1 100 34.5 COSTOSO
2 145 2.3 BARATO
3 100 34.5 COSTOSO
4 100 34.5 COSTOSO
5 145 10 ASEQUIBLE

Use CASO para CONTAR el número de filas en una columna que coincida con una condición.

Caso de uso

CASE se puede usar junto con SUM para devolver un recuento de solo aquellos elementos que coinciden con una condición predefinida. (Esto es similar a COUNTIF en Excel.)

El truco es devolver resultados binarios que indiquen coincidencias, por lo que los "1" devueltos para las entradas coincidentes se pueden sumar para un recuento del número total de coincidencias.

Dada esta tabla de ItemSales , supongamos que desea conocer el número total de artículos que se han categorizado como "Caros":

Carné de identidad Identificación del artículo Precio Precio
1 100 34.5 COSTOSO
2 145 2.3 BARATO
3 100 34.5 COSTOSO
4 100 34.5 COSTOSO
5 145 10 ASEQUIBLE

Consulta

SELECT 
    COUNT(Id) AS ItemsCount,
    SUM ( CASE 
            WHEN PriceRating = 'Expensive' THEN 1
            ELSE 0
          END
        ) AS ExpensiveItemsCount
FROM ItemSales 

Resultados:

ArtículosCuenta ExpensiveItemsCount
5 3

Alternativa:

SELECT 
    COUNT(Id) as ItemsCount,
    SUM (
        CASE PriceRating 
            WHEN 'Expensive' THEN 1
            ELSE 0
        END
       ) AS ExpensiveItemsCount
FROM ItemSales 

CASTILLO ABREVIADO en SELECCIONAR

La variante abreviada de CASE evalúa una expresión (generalmente una columna) contra una serie de valores. Esta variante es un poco más corta y guarda la repetición de la expresión evaluada una y otra vez. La cláusula ELSE todavía se puede utilizar, sin embargo:

SELECT Id, ItemId, Price,
  CASE Price WHEN 5  THEN 'CHEAP'
             WHEN 15 THEN 'AFFORDABLE'
             ELSE         'EXPENSIVE'
  END as PriceRating
FROM ItemSales

Una palabra de precaución. Es importante darse cuenta de que cuando se usa la variante corta, la declaración completa se evalúa en cada WHEN . Por lo tanto la siguiente declaración:

SELECT 
    CASE ABS(CHECKSUM(NEWID())) % 4
        WHEN 0 THEN 'Dr'
        WHEN 1 THEN 'Master'
        WHEN 2 THEN 'Mr'
        WHEN 3 THEN 'Mrs'
    END

puede producir un resultado NULL . Esto se debe a que en cada WHEN NEWID() se llama de nuevo con un nuevo resultado. Equivalente a:

SELECT 
    CASE 
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
    END

Por lo tanto, puede pasar por alto todos los casos de WHEN y el resultado es NULL

CASO en una cláusula ORDENAR POR

Podemos usar 1,2,3 .. para determinar el tipo de orden:

SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
      WHEN 'MARKETING' THEN  1
      WHEN 'SALES' THEN 2
      WHEN 'RESEARCH' THEN 3
      WHEN 'INNOVATION' THEN 4
      ELSE        5
      END,
      CITY
CARNÉ DE IDENTIDAD REGIÓN CIUDAD DEPARTAMENTO EMPLEADOS_NUMBER
12 Nueva Inglaterra Bostón MÁRKETING 9
15 Oeste San Francisco MÁRKETING 12
9 Medio oeste Chicago VENTAS 8
14 Atlántico medio Nueva York VENTAS 12
5 Oeste los Angeles INVESTIGACIÓN 11
10 Atlántico medio Filadelfia INVESTIGACIÓN 13
4 Medio oeste Chicago INNOVACIÓN 11
2 Medio oeste Detroit RECURSOS HUMANOS 9

Usando CASE en ACTUALIZAR

muestra sobre aumentos de precios:

UPDATE ItemPrice
SET Price = Price *
  CASE ItemId
    WHEN 1 THEN 1.05
    WHEN 2 THEN 1.10
    WHEN 3 THEN 1.15
    ELSE 1.00
  END

Uso de CASE para valores NULOS ordenados en último lugar

de esta manera, el '0' que representa los valores conocidos se clasifica primero, el '1' que representa los valores NULL se ordenan por el último:

SELECT ID
      ,REGION
      ,CITY
      ,DEPARTMENT
      ,EMPLOYEES_NUMBER
  FROM DEPT
  ORDER BY 
  CASE WHEN REGION IS NULL THEN 1 
  ELSE 0
  END, 
  REGION
CARNÉ DE IDENTIDAD REGIÓN CIUDAD DEPARTAMENTO EMPLEADOS_NUMBER
10 Atlántico medio Filadelfia INVESTIGACIÓN 13
14 Atlántico medio Nueva York VENTAS 12
9 Medio oeste Chicago VENTAS 8
12 Nueva Inglaterra Bostón MÁRKETING 9
5 Oeste los Angeles INVESTIGACIÓN 11
15 NULO San Francisco MÁRKETING 12
4 NULO Chicago INNOVACIÓN 11
2 NULO Detroit RECURSOS HUMANOS 9

CASO en la cláusula ORDER BY para ordenar los registros por el valor más bajo de 2 columnas

Imagine que necesita ordenar los registros por el valor más bajo de una de las dos columnas. Algunas bases de datos podrían usar una función MIN() o LEAST() no agregada para esto ( ... ORDER BY MIN(Date1, Date2) ), pero en SQL estándar, tiene que usar una expresión CASE .

La expresión CASE en la consulta siguiente examina las columnas Date1 y Date2 , verifica qué columna tiene el valor más bajo y ordena los registros según este valor.

Data de muestra

Carné de identidad Fecha 1 Fecha 2
1 2017-01-01 2017-01-31
2 2017-01-31 2017-01-03
3 2017-01-31 2017-01-02
4 2017-01-06 2017-01-31
5 2017-01-31 2017-01-05
6 2017-01-04 2017-01-31

Consulta

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE 
           WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1 
           ELSE Date2 
         END

Resultados

Carné de identidad Fecha 1 Fecha 2
1 2017-01-01 2017-01-31
3 2017-01-31 2017-01-02
2 2017-01-31 2017-01-03
6 2017-01-04 2017-01-31
5 2017-01-31 2017-01-05
4 2017-01-06 2017-01-31

Explicación

Como ve, la fila con Id = 1 es la primera, porque debido a que Date1 tiene el registro más bajo de toda la tabla 2017-01-01 , la fila donde Id = 3 es la segunda, porque Date2 es igual a 2017-01-02 que es el segundo valor más bajo de la tabla y así.

Por lo tanto, hemos ordenado los registros de 2017-01-01 a 2017-01-06 ascendentes y no nos importa en qué columna Date1 o Date2 son esos valores.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow