web-dev-qa-db-ja.com

T-SQL Case / Whenの使用方法

case/whenを頻繁に使用する巨大なクエリがあります。ここにこのSQLがありますが、これは機能しません。

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

問題の原因はxyz.somethingelseagain = 2、その式をバインドできなかったと言います。 xyzは、クエリのさらに下に結合されるテーブルのエイリアスです。どうしたの? 2つのケース/時のうちの1つを削除するとそれが修正されますが、私は両方を必要とし、おそらくさらに多くのケースが必要です。

42
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;
91
Florian Reischl

WHENステートメントが真であるとすぐに、ブレークは暗黙的です。

どの表現が起こる可能性が最も高いかを検討する必要があります。 WHENステートメントの長いリストの最後にそのWHENを配置すると、SQLが遅くなる可能性があります。それで最初にそれを前に置いてください。

詳細はこちら: T-SQLのcaseステートメントのブレーク

8
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

論理テストが単一の列に対して行われる場合、次のようなものを使用できます

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  

詳細- https://docs.Microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-2017

1
BI Dude