Cas dans l'instruction Select

141

J'ai une instruction SQL qui a un CASEfrom SELECTet je ne peux pas faire les choses correctement. Pouvez-vous me montrer un exemple CASEoù les cas sont les conditions et les résultats sont des cas. Par exemple:

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

où les résultats montrent

 name                         age       handphone
xxx1                         yyy1      blackberry
xxx2                         yyy2      blackberry
fadzli feizal
la source
Ma réponse expliquant deux types de cas 1. Expression CASE simple 2. Expressions CASE recherchées. Et l'utilisation de la casse des deux types dans SELECT, UPDATE, With ORDER BY, With HAVING requêtes.
Somnath Muluk

Réponses:

195

Le MSDN est une bonne référence pour ce type de questions concernant la syntaxe et l'utilisation. Cela provient de la page Transact SQL Reference - 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

Un autre bon site que vous voudrez peut-être consulter si vous utilisez SQL Server est SQL Server Central . Cela a une grande variété de ressources disponibles pour n'importe quel domaine de SQL Server que vous souhaitez apprendre.

NuNn DaDdY
la source
82

Je pense que cela pourrait vous être utile.

Utiliser une SELECTinstruction avec une CASEexpression simple

Dans une SELECTinstruction, une CASEexpression simple permet uniquement un contrôle d'égalité; aucune autre comparaison n'est faite. L'exemple suivant utilise l' CASEexpression pour modifier l'affichage des catégories de lignes de produits afin de les rendre plus compréhensibles.

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

Utilisation d'une SELECTinstruction avec une CASEexpression recherchée

Dans une SELECTinstruction, l' CASEexpression recherchée permet de remplacer les valeurs dans l'ensemble de résultats en fonction des valeurs de comparaison. L'exemple suivant affiche le prix catalogue sous forme de commentaire textuel en fonction de la fourchette de prix d'un produit.

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

Utilisation CASEdans une ORDER BYclause

Les exemples suivants utilisent l' CASEexpression dans une ORDER BYclause pour déterminer l'ordre de tri des lignes en fonction d'une valeur de colonne donnée. Dans le premier exemple, la valeur de la colonne SalariedFlag de la table HumanResources.Employee est évaluée. Les employés dont le SalariedFlag est défini sur 1 sont renvoyés dans l'ordre par BusinessEntityID dans l'ordre décroissant. Les employés dont le SalariedFlag est défini sur 0 sont renvoyés dans l'ordre par BusinessEntityID dans l'ordre croissant. Dans le deuxième exemple, le jeu de résultats est trié par la colonne TerritoryName lorsque la colonne CountryRegionName est égale à «United States» et par CountryRegionName pour toutes les autres lignes.

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;

Utilisation CASEdans une UPDATEdéclaration

L'exemple suivant utilise l' CASEexpression dans une UPDATEinstruction pour déterminer la valeur qui est définie pour la colonne VacationHours pour les employés avec SalariedFlag défini sur 0. Lorsque la soustraction de 10 heures à VacationHours donne une valeur négative, VacationHours est augmenté de 40 heures; sinon, VacationHours est augmenté de 20 heures. La OUTPUTclause est utilisée pour afficher les valeurs avant et après les vacances.

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; 

Utilisation CASEdans une HAVINGclause

L'exemple suivant utilise l' CASEexpression dans une HAVINGclause pour restreindre les lignes renvoyées par l' SELECTinstruction. L'instruction renvoie le taux horaire maximal pour chaque titre de poste dans la table HumanResources.Employee. La HAVINGclause limite les titres à ceux qui sont détenus par des hommes avec un taux de rémunération maximum supérieur à 40 dollars ou par des femmes avec un taux de rémunération maximum supérieur à 42 dollars.

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;

Pour plus de détails sur la description de ces exemples, visitez la source .

Visitez également ici et ici pour quelques exemples avec de grands détails.

Sabir Al Fateh
la source
J'apprécie vraiment une réponse aussi détaillée.
Aneeq Azam Khan
12

vous pouvez aussi utiliser:

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
user5035983
la source