wake-up-neo.com

Wie verwende ich T-SQL Case/Wann?

Ich habe eine große Abfrage, die case/when häufig verwendet. Jetzt habe ich diese SQL hier, die nicht funktioniert.

 (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],

Was ärgerlich ist xyz.somethingelseagain = 2, besagt, dass es diesen Ausdruck nicht binden konnte. xyz ist ein Alias ​​für eine Tabelle, die in der Abfrage weiter unten eingefügt wird. Was ist hier los? Das Entfernen eines der beiden Fälle/Zeitpunkte korrigiert das, aber ich brauche beide, wahrscheinlich sogar mehr Fälle.

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

Sobald eine WHEN-Anweisung wahr ist, ist der Bruch implizit.

Sie müssen sich überlegen, welches WENN am wahrscheinlichsten ist. Wenn Sie dieses WHEN am Ende einer langen Liste von WHEN-Anweisungen setzen, ist Ihre SQL wahrscheinlich langsamer. Also als erstes nach vorne stellen.

Weitere Informationen hier: break in case-Anweisung in T-SQL

7
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

Wenn sich der logische Test gegen eine einzelne Spalte richtet, können Sie so etwas verwenden 

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  

Weitere Informationen - https://docs.Microsoft.com/de-de/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

0
BI Dude