2017-08-24 15 views
1

を使用してすべての包括的なカテゴリを含める:は、CASE文

CASE WHEN Category='A' THEN 'Discharged' 
    WHEN Category='B' THEN 'Not Discharged' 
    WHEN Category='A' OR Category='B' THEN 'Both' 
    END AS Status 

を私はケースが別々の「両方」のステータスレコードが表示されないことに注意してください。 「ディスチャージ」または「ディスチャージされていません」と表示されます。 CASE式に 'Discharged'または 'Discharged'の結果と一緒に別の 'Both'結果を含める方法はありますか?

「両方」の条件を「放電済み」または「放電していない」に設定すると、出力にはすべてのレコードに対して「両方」が表示されます。私はCASEが逐次であるという論理を持っていると信じています。

+0

いくつかのサンプルデータを提供できますか?また、全体のクエリを投稿することはできますか? –

+0

これでどのようなことを達成したいのですか?カテゴリーはAとBにしか分類できませんか?そうであれば、放電された/放電されていないすべてのレコードについて、「両方」を印刷しないでください。 –

+0

このステータスフィールドは、実際にはBIツールに供給され、フィルタとして使用されます。 「どちらか」を選択する代わりに、「両方」ステータスを使用すると、すべての結果を表示することができます。 – AS91

答えて

1

CASEコードの「出現」の順番で評価され、短絡されます。あなたのケースでは、最後のWHENを最初の位置に移動してください。

CASE式は、ビット単位ではなくブール比較を使用します。ビット単位の比較のために

CASE 
    WHEN Category='A' AND Category='B' THEN 'Both' 
    WHEN Category='A' THEN 'Discharged' 
    WHEN Category='B' THEN 'Not Discharged' 
END AS Status 

この試してみてください。

DECLARE @Category INT = ASCII('A')|ASCII('B') 
SELECT 
    CASE 
     WHEN @Category = (ASCII('A')|ASCII('B')) THEN 'Both' 
     WHEN @Category= ASCII('A') THEN 'Discharged' 
     WHEN @Category= ASCII('B') THEN 'Not Discharged' 
    END AS Status 

注:あなたの条件に一致の非場合NULLが返されることを避けるために、同様ELSE条件を持っているのは良いアイデアです。

ビット単位の演算子と使用法の完全なリストを参照してください:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-operators-transact-sql

あなたはそれがWHERE句に表示されます。すなわち、その式でフィルタリングする場合は、あなたは違っそれを記述する必要があります。

DECLARE @SearchCriteria VARCHAR(50) 
SET @SearchCriteria = 'Both' 
SELECT Category 
FROM (VALUES('A'), ('B')) AS a(Category) 
WHERE 
    Category = (CASE @SearchCriteria 
     WHEN 'Discharged' THEN 'A' 
     WHEN 'Not Discharged' THEN 'B' 
     WHEN 'Both' THEN Category 
    END) 
+0

行レベルのカテゴリは両方ともAとB.両方の考えは、それがすべて包括的であるということです。同時に放電しても放電しなくてもよいというわけではありません。私がBothにフィルタリングすると、基本的にすべてのステータスを取得できるように、ステータスは「Both」として表示されます。 2である。 ELSEを含めて+1しましたが、私は事を少しでも簡単にするためにここにはいませんでした。 – AS91

+0

@ AS91 - うまくいけば、第3の選択肢が必要です – Alex

1

あなたは使用できるUNION

SELECT person_id, 
     ... 
     CASE WHEN Category='A' THEN 'Discharged' 
      WHEN Category='B' THEN 'Not Discharged' 
     END AS Status 
    FROM table 
UNION 
SELECT person_id, 
     ... 
     'Both' AS Status 
    FROM table