web-dev-qa-db-ja.com

CASEステートメントの複数の条件

下に簡単な表があります。

Select * from message_log where  Message = 'BUILD' order by 1;

+------------+-------------+
|  **Message |     Log**   |
+------------+-------------+
|    Build   |  Day Start  |
+------------+-------------+
|    Build   |  Day End    |
+------------+-------------+
|    Build   |  Dusk Start |
+------------+-------------+
|    Build   |  Dusk End   |
+------------+-------------+
|    Build   |  Night Start|
+------------+-------------+
|    Build   |  Night End  |
+------------+-------------+

例えばCASE文を書いたら

SELECT DISTINCT CASE WHEN (Log = 'Day Start') THEN 'RUNNING' END AS A
from message_log where  Message = 'BUILD' order by 1;

Null値と「RUNNING」値を返しますが、Null行を含まないように記述できますか?

1
StevenM

WHERE条件を追加するだけです。また、1つの値RUNNINGのみを表示している場合は、CASEを使用する理由はありません。それ以外の場合は、CASEの各条件を評価する必要があります。これには、どの条件も満たされない場合に何を表示するかが含まれます。デフォルト値。

だからここにあなたの元の質問のコードがあります:

SELECT 'RUNNING' AS A
from message_log 
where  Message = 'BUILD' 
    AND Log = 'Day Start'
order by 1;

そして、これは複数条件CASEのコードです:

SELECT CASE 
    WHEN (Log = 'Day Start') THEN 'RUNNING' 
    WHEN (Log = 'Day End')   THEN 'NOT RUNNING'
    ELSE 'UNKNOWN' END AS A
from message_log 
    where  Message = 'BUILD' 
order by 1;
4

複数のクエリでそのcaseステートメントを繰り返さなければならない可能性があるcaseステートメントにデータを置くのではなく、静的データを含むテーブルを作成して、そのテーブルに結合することができます。利点は、そのcaseステートメントを含むすべてのクエリを変更するよりも簡単にテーブルのデータを変更できることです。

0
Gandolf989

あなたが達成しようとしていることは何ですか?

SELECT CASE WHEN (Log = 'Day Start') THEN 'RUNNING' END AS A
from message_log 
where Message = 'BUILD' 
order by 1;

...すべての行をスキャンし、各行に対して「RUNNING」またはNULLを返します。この結果セットには数百万の行が含まれる可能性があります。

SELECT DISTINCT ... query 

...これらの戻り値を1つずつ取得し、[2つの]「異なる」値だけに要約します。

これは過度に「有用な」クエリであるとは思いません。あなたは何をしましたか希望それは何をしますか?

0
Phill W.