Caso en declaración selecta

141

Tengo una instrucción SQL que tiene un CASEfrom SELECTy simplemente no puedo hacerlo bien. ¿Pueden mostrarme un ejemplo de CASEdónde están las condiciones y los resultados de los casos? Por ejemplo:

     Select xxx, yyy
     case : desc case when bbb then 'blackberry';
     when sss then 'samsung';
     end 
     from (select ???? .....

donde muestran los resultados

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry
fadzli feizal
fuente
Mi respuesta explica dos tipos de casos 1. Expresión CASE simple 2. Expresiones CASE buscadas. Y el uso de mayúsculas y minúsculas de ambos tipos en SELECCIONAR, ACTUALIZAR, ORDENAR POR, CON TENER consultas.
Somnath Muluk

Respuestas:

195

El MSDN es una buena referencia para este tipo de preguntas sobre sintaxis y uso. Esto es de la Referencia de Transact SQL - página CASE.

http://msdn.microsoft.com/en-us/library/ms181765.aspx

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Name, "Price Range" = 
  CASE 
     WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
     WHEN ListPrice < 50 THEN 'Under $50'
     WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
     WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
     ELSE 'Over $1000'
  END
FROM Production.Product
ORDER BY ProductNumber ;
GO

Otro buen sitio que puede consultar si está utilizando SQL Server es SQL Server Central . Esto tiene una gran variedad de recursos disponibles para cualquier área de SQL Server que le gustaría aprender.

NuNn DaDdY
fuente
82

Creo que esto podría ser útil para ti.

Usando una SELECTdeclaración con una CASEexpresión simple

Dentro de una SELECTdeclaración, una CASEexpresión simple permite solo una verificación de igualdad; No se hacen otras comparaciones. El siguiente ejemplo utiliza la CASEexpresión para cambiar la visualización de las categorías de línea de productos para que sean más comprensibles.

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Category =
      CASE ProductLine
         WHEN 'R' THEN 'Road'
         WHEN 'M' THEN 'Mountain'
         WHEN 'T' THEN 'Touring'
         WHEN 'S' THEN 'Other sale items'
         ELSE 'Not for sale'
      END,
   Name
FROM Production.Product
ORDER BY ProductNumber;
GO

Usar una SELECTdeclaración con una CASEexpresión buscada

Dentro de una SELECTdeclaración, la CASEexpresión buscada permite que los valores se reemplacen en el conjunto de resultados en función de los valores de comparación. El siguiente ejemplo muestra el precio de lista como un comentario de texto basado en el rango de precios de un producto.

USE AdventureWorks2012;
GO
SELECT   ProductNumber, Name, "Price Range" = 
      CASE 
         WHEN ListPrice =  0 THEN 'Mfg item - not for resale'
         WHEN ListPrice < 50 THEN 'Under $50'
         WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250'
         WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000'
         ELSE 'Over $1000'
      END
FROM Production.Product
ORDER BY ProductNumber ;
GO

Usando CASEen una ORDER BYcláusula

Los siguientes ejemplos utilizan la CASEexpresión en una ORDER BYcláusula para determinar el orden de clasificación de las filas en función de un valor de columna dado. En el primer ejemplo, se evalúa el valor en la columna SalariedFlag de la tabla HumanResources.Employee. BusinessEntityID devuelve a los empleados que tienen el SalariedFlag establecido en 1 en orden descendente. BusinessEntityID devuelve a los empleados que tienen el SalariedFlag establecido en 0 en orden ascendente. En el segundo ejemplo, el conjunto de resultados está ordenado por la columna TerritoryName cuando la columna CountryRegionName es igual a 'Estados Unidos' y por CountryRegionName para todas las demás filas.

SELECT BusinessEntityID, SalariedFlag
FROM HumanResources.Employee
ORDER BY CASE SalariedFlag WHEN 1 THEN BusinessEntityID END DESC
        ,CASE WHEN SalariedFlag = 0 THEN BusinessEntityID END;
GO


SELECT BusinessEntityID, LastName, TerritoryName, CountryRegionName
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL
ORDER BY CASE CountryRegionName WHEN 'United States' THEN TerritoryName
         ELSE CountryRegionName END;

Usando CASEen una UPDATEdeclaración

El siguiente ejemplo utiliza la CASEexpresión en una UPDATEinstrucción para determinar el valor que se establece para la columna VacationHours para empleados con SalariedFlag establecido en 0. Cuando restar 10 horas de VacationHours resulta en un valor negativo, VacationHours se incrementa en 40 horas; de lo contrario, VacationHours se incrementa en 20 horas. La OUTPUTcláusula se utiliza para mostrar los valores de vacaciones antes y después.

USE AdventureWorks2012;
GO
UPDATE HumanResources.Employee
SET VacationHours = 
    ( CASE
         WHEN ((VacationHours - 10.00) < 0) THEN VacationHours + 40
         ELSE (VacationHours + 20.00)
       END
    )
OUTPUT Deleted.BusinessEntityID, Deleted.VacationHours AS BeforeValue, 
       Inserted.VacationHours AS AfterValue
WHERE SalariedFlag = 0; 

Usando CASEen una HAVINGcláusula

El siguiente ejemplo usa la CASEexpresión en una HAVINGcláusula para restringir las filas devueltas por la SELECTinstrucción. La declaración devuelve la tarifa máxima por hora para cada título de trabajo en la tabla HumanResources.Employee. La HAVINGcláusula restringe los títulos a los que tienen los hombres con una tasa de pago máxima superior a 40 dólares o las mujeres con una tasa de pago máxima superior a 42 dólares.

USE AdventureWorks2012;
GO
SELECT JobTitle, MAX(ph1.Rate)AS MaximumRate
FROM HumanResources.Employee AS e
JOIN HumanResources.EmployeePayHistory AS ph1 ON e.BusinessEntityID = ph1.BusinessEntityID
GROUP BY JobTitle
HAVING (MAX(CASE WHEN Gender = 'M' 
        THEN ph1.Rate 
        ELSE NULL END) > 40.00
     OR MAX(CASE WHEN Gender  = 'F' 
        THEN ph1.Rate  
        ELSE NULL END) > 42.00)
ORDER BY MaximumRate DESC;

Para obtener más detalles sobre la descripción de este ejemplo, visite la fuente .

También visite aquí y aquí para ver algunos ejemplos con excelentes detalles.

Sabir Al Fateh
fuente
Realmente aprecio una respuesta tan detallada.
Aneeq Azam Khan
12

también puedes usar:

SELECT CASE
         WHEN upper(t.name) like 'P%' THEN
          'productive'
         WHEN upper(t.name) like 'T%' THEN
          'test'
         WHEN upper(t.name) like 'D%' THEN
          'development'
         ELSE
          'unknown'
       END as type
FROM table t
usuario5035983
fuente