152 votes

Cas dans la déclaration Select

J'ai une instruction SQL qui a un CASE de SELECT et je n'arrive pas à le faire correctement. Pouvez-vous me montrer un exemple de CASE où les cas sont les conditions et les résultats sont issus 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

208voto

NuNn DaDdY Points 752

Le MSDN est une bonne référence pour ce type de questions concernant la syntaxe et l'utilisation. Ceci est tiré 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 site intéressant à consulter si vous utilisez SQL Server est le suivant SQL Server Central . Il dispose d'une grande variété de ressources disponibles pour tous les domaines de SQL Server que vous souhaitez apprendre.

93voto

Sabir Al Fateh Points 955

Je pense que cela pourrait vous être utile.

Utilisation d'un SELECT avec un simple CASE expression

Dans un délai de SELECT une simple déclaration CASE ne permet qu'une vérification de l'égalité ; aucune autre comparaison n'est effectuée. L'exemple suivant utilise l'expression CASE expression 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'un SELECT avec une déclaration recherchée CASE expression

Dans un délai de SELECT la déclaration recherchée CASE permet de remplacer des valeurs dans le jeu de résultats sur la base de valeurs de comparaison. L'exemple suivant affiche le prix de liste sous forme de commentaire textuel en fonction de la gamme 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 de CASE dans un ORDER BY clause

Les exemples suivants utilisent l'option CASE dans une expression ORDER BY 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 égal à 1 sont classés par BusinessEntityID dans l'ordre décroissant. Les employés dont la valeur de SalariedFlag est égale à 0 sont renvoyés dans l'ordre croissant de leur BusinessEntityID. Dans le deuxième exemple, le jeu de résultats est ordonné 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 de CASE dans un UPDATE déclaration

L'exemple suivant utilise le CASE dans une expression UPDATE Si la soustraction de 10 heures de la colonne VacationHours donne une valeur négative, VacationHours est augmenté de 40 heures, sinon, VacationHours est augmenté de 20 heures. Le site OUTPUT La clause 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 de CASE dans un HAVING clause

L'exemple suivant utilise le CASE dans une expression HAVING pour restreindre les rangs retournés par la requête SELECT déclaration. L'instruction renvoie le taux horaire maximum pour chaque titre de poste dans la table HumanResources.Employee. L'adresse HAVING La clause restreint les titres à ceux qui sont détenus par des hommes dont le taux de rémunération maximal est supérieur à 40 dollars ou par des femmes dont le taux de rémunération maximal est 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 une description plus détaillée de ces exemples, visitez le site source .

Visitez également aquí y aquí pour des exemples très détaillés.

15voto

user5035983 Points 151

Vous pouvez également 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

0voto

J'ai ajouté ceci à l'instruction SELECT et je n'ai pas pu trouver les champs.

"SPARE_A" = 
        CASE 
            WHEN dbname.dbo.IN10.SPARE5 = 'A' THEN dbname.dbo.IN42.ITEM_NUMB
            ELSE 'NULL' 
        END

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X