ORはSQL ServerのCASEステートメントではサポートされていません


回答:


1079

この形式では、次のいずれかを使用する必要があります。

CASE ebv.db_no 
  WHEN 22978 THEN 'WECS 9500' 
  WHEN 23218 THEN 'WECS 9500'  
  WHEN 23219 THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

それ以外の場合は、次を使用します。

CASE  
  WHEN ebv.db_no IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

9
2番目のケースで、「=」ではなく「IN」だけが機能するのはなぜですか?
Han

25
=単一の値と比較している場合に機能します。ただし、(22978, 23218, 23219)は配列でありIN、値の1つだけに一致する必要があります。
LdTrigger 2016年

2
これは本当に悪臭を放ちます。t-sqlは、caseステートメントの「or」を処理できません。マイクロソフトの時間に来て、おもちゃのデータベースステータスから成長してください。
リッチビアンコ

1
「Caseステートメントでは「または」を処理できません」..うーん....スイッチを見たときに、どの言語の「または」も受け入れられるとは思いません。スイッチの目的を無効にするようです。ケースでどの言語が「または」を受け入れますか?
Heriberto Lugo

2
@Heriberto Lugoあなたが知っている言語の数はわかりませんが、少なくともいくつかはあります。VB.NETとC#は、単純なコンマ区切りでそれらを使用できます。同じコードを何度も繰り返さなくても済むので、何の問題もありません。
ジョニープレスコット

249
CASE
  WHEN ebv.db_no = 22978 OR 
       ebv.db_no = 23218 OR
       ebv.db_no = 23219
  THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

38
賛成-この回答は付加価値をもたらします。これはOPの質問により密接に適合します。CASE-WHENSをネストする場合、この構文により必要なコードが大幅に削減されます。
Matt Kemp、

1
@Leighこの回答に感謝します。1つのスレッドにさまざまな形式をすべて含めると、参照として使用しやすくなります。
Jason Wheeler 14

3
@Bigwheels-うわー..これは少し前のことです。論理的には他の応答とまったく同じであるため、おそらく反対しました。そうは言っても、あなたとマットは有効な主張をしています。質問が「OR のみを使用した正しい構文は何か」であった場合、これは答えを提供します。ただし、「必要な構文の削減」が目的である場合、受け入れられる応答はよりコンパクトになります。ところで、それは完全に有効であるダレンの答えのスラムではありません。ちょうど私の$ 0.02 :)
リー14

2
INキーワードを使用する方がはるかに良い方法です
Sagar Naliyapara 2017

57
CASE WHEN ebv.db_no  IN (22978, 23218, 23219) THEN 'WECS 9500' 
  ELSE 'WECS 9520' 
END as wecs_system 

53

WHENの式のいずれかを使用できますが、両方を混在させることはできません。

  1. いつwhen_expression

    単純なCASE形式が使用されるときにinput_expressionが比較される単純な式です。when_expressionは任意の有効な式です。input_expressionと各when_expressionのデータ型は同じであるか、暗黙的な変換である必要があります。

  2. WHEN Boolean_expression

    検索されたCASE形式を使用するときに評価されるブール式です。Boolean_expressionは、任意の有効なブール式です。

あなたはプログラムすることができます:

1。

    CASE ProductLine
            WHEN 'R' THEN 'Road'
            WHEN 'M' THEN 'Mountain'
            WHEN 'T' THEN 'Touring'
            WHEN 'S' THEN 'Other sale items'
            ELSE 'Not for sale'

2。

    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

しかし、いずれの場合でも、変数のランキングがブール式で比較されることを期待できます。

CASE(Transact-SQL)(MSDN)を参照してください。


37

に関してはすでに多くの回答がありますCASE。いつ、どのように使うか説明しますCASE

SQLクエリ内の任意の場所でCASE式を使用できます。CASE式は、SELECTステートメント、WHERE句、Order by句、HAVING句、Insert、UPDATE、およびDELETEステートメント内で使用できます。

CASE式には次の2つの形式があります。

  1. 単純なCASE式

    CASE expression
    WHEN expression1 THEN Result1
    WHEN expression2 THEN Result2
    ELSE ResultN
    END

    これは、式を単純な式のセットと比較して結果を見つけます。この式は、式を各WHEN句の式と比較して同等であるかどうかを調べます。WHEN句内の式が一致した場合、THEN句内の式が返されます。

    ここでOPの問題が解決されます。22978 OR 23218 OR 23219式に等しい値、つまりebv.db_noを取得しません。それがエラーを出している理由です。input_expressionと各when_expressionのデータ型は同じであるか、暗黙的な変換である必要があります。

  2. 検索されたCASE式

    CASE
    WHEN Boolean_expression1 THEN Result1
    WHEN Boolean_expression2 THEN Result2
    ELSE ResultN
    END

    この式は、ブール式のセットを評価して結果を見つけます。この式では、各ブール式で比較演算子と論理演算子AND / ORを使用できます。

1. CASE式を使用したSELECTステートメント

--Simple CASE expression: 
SELECT FirstName, State=(CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

-- Searched CASE expression:
SELECT FirstName,State=(CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END), PayRate
FROM dbo.Customer

2. CASE式でス​​テートメントを更新する

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE StateCode
 WHEN 'MP' THEN 'Madhya Pradesh' 
 WHEN 'UP' THEN 'Uttar Pradesh' 
 WHEN 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

-- Simple CASE expression: 
UPDATE Customer 
SET StateCode = CASE 
 WHEN StateCode = 'MP' THEN 'Madhya Pradesh' 
 WHEN StateCode = 'UP' THEN 'Uttar Pradesh' 
 WHEN StateCode = 'DL' THEN 'Delhi' 
 ELSE NULL 
 END 

3.CASE式を使用したORDER BY句

-- Simple CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE Gender WHEN 'M' THEN FirstName END Desc,
 CASE Gender WHEN 'F' THEN LastName END ASC

-- Searched CASE expression: 
SELECT * FROM dbo.Customer
ORDER BY 
 CASE WHEN Gender='M' THEN FirstName END Desc,
 CASE WHEN Gender='F' THEN LastName END ASC

4. CASE式を含む句

-- Simple CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE Gender WHEN 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE Gender WHEN 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

-- Searched CASE expression: 
SELECT FirstName ,StateCode,Gender, Total=MAX(PayRate)
FROM dbo.Customer
GROUP BY StateCode,Gender,FirstName
HAVING (MAX(CASE WHEN Gender = 'M' 
 THEN PayRate 
 ELSE NULL END) > 180.00
 OR MAX(CASE WHEN Gender = 'F' 
 THEN PayRate 
 ELSE NULL END) > 170.00)

このユースケースが将来誰かを助けることを願っています。

ソース


34

試す

CASE WHEN ebv.db_no IN (22978,23218,23219) THEN 'WECS 9500' ELSE 'WECS 9520' END

28
SELECT
  Store_Name,
  CASE Store_Name
    WHEN 'Los Angeles' THEN Sales * 2
    WHEN 'San Diego' THEN Sales * 1.5
    ELSE Sales
    END AS "New Sales",
  Txn_Date
FROM Store_Information;

1
ELSE Salesビジネスクエリに適した、caseステートメントに他に含まれていない場合にデフォルト値を返すフィールドが含まれているため、賛成票を投じます。
FoxDeploy 2018年

3
select id,phno,case gender
when 'G' then 'M'
when 'L' then 'F'
else
'No gender'
end
as gender 
from contacts

1
ここで何が行われているのか説明しないのですか?これがどのように問題を解決するかを理解するために初心者が必要とする場合があるので、説明で完全な回答を与えることが重要です
Gerhard Barnard

3
UPDATE table_name 
  SET column_name=CASE 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
WHEN column_name in ('value1', 'value2',.....) 
  THEN 'update_value' 
END

table_name =操作を実行するテーブルの名前。

column_name =値を設定する列/フィールドの名前。

update_value =設定する値 column_name


11
このコードはOPの問題を解決する可能性がありますが、いくつかの説明が将来の読者にさらに役立つでしょう。
Thom

-5
Select s.stock_code,s.stock_desc,s.stock_desc_ar,
mc.category_name,s.sel_price,
case when s.allow_discount=0 then 'Non Promotional Item' else 'Prmotional 
item' end 'Promotion'
From tbl_stock s inner join tbl_stock_category c on s.stock_id=c.stock_id
inner join tbl_category mc on c.category_id=mc.category_id
where mc.category_id=2 and s.isSerialBased=0 

1
この回答は、質問とは関係がないようです。
LarsTech 2016年

4
裸のコードを投稿しないでください。また、コードの動作の説明も提供してください。
Jonathan Mee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.