web-dev-qa-db-fra.com

Comment utiliser T-SQL Case/When?

J'ai une énorme requête qui utilise case/when souvent. Maintenant, j'ai ce code SQL ici, qui ne fonctionne pas.

 (select case when xyz.something = 1
 then
     'SOMETEXT'
 else
      (select case when xyz.somethingelse = 1)
      then
          'SOMEOTHERTEXT'
      end) 

      (select case when xyz.somethingelseagain = 2)
      then
          'SOMEOTHERTEXTGOESHERE'
      end)
 end) [ColumnName],

Ce qui cause problème est xyz.somethingelseagain = 2, il est dit qu'il ne peut pas lier cette expression. xyz est un alias pour une table qui est jointe plus bas dans la requête. Quel est le problème ici? Supprimer l'un des 2 cas/qui corrige cela, mais il me faut les deux, probablement même plus de cas.

38
grady
SELECT
   CASE 
   WHEN xyz.something = 1 THEN 'SOMETEXT'
   WHEN xyz.somethingelse = 1 THEN 'SOMEOTHERTEXT'
   WHEN xyz.somethingelseagain = 2 THEN 'SOMEOTHERTEXTGOESHERE'
   ELSE 'SOMETHING UNKNOWN'
   END AS ColumnName;
85
Florian Reischl

Dès qu'une déclaration WHEN est vraie, l'interruption est implicite.

Vous devrez déterminer quelle expression de WHEN est la plus susceptible de se produire. Si vous placez WHEN à la fin d'une longue liste d'instructions WHEN, votre SQL sera probablement plus lent. Alors mettez-le en avant comme le premier.

Plus d'informations ici: Instruction de casse dans la casse dans T-SQL

7
Per Hoffmann Olsen
declare @n int = 7,
    @m int = 3;

select 
    case 
        when @n = 1 then
            'SOMETEXT'
    else
        case 
            when @m = 1 then
                'SOMEOTHERTEXT'
            when @m = 2 then
                'SOMEOTHERTEXTGOESHERE'
        end
    end as col1
-- n=1 => returns SOMETEXT regardless of @m
-- n=2 and m=1 => returns SOMEOTHERTEXT
-- n=2 and m=2 => returns SOMEOTHERTEXTGOESHERE
-- n=2 and m>2 => returns null (no else defined for inner case)
1
Mikkel

Si le test logique concerne une seule colonne, vous pouvez utiliser quelque chose comme: 

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  

Plus d'informations - https://docs.Microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

0
BI Dude