下に簡単な表があります。
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行を含まないように記述できますか?
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;
複数のクエリでそのcaseステートメントを繰り返さなければならない可能性があるcaseステートメントにデータを置くのではなく、静的データを含むテーブルを作成して、そのテーブルに結合することができます。利点は、そのcaseステートメントを含むすべてのクエリを変更するよりも簡単にテーブルのデータを変更できることです。
あなたが達成しようとしていることは何ですか?
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つの]「異なる」値だけに要約します。
これは過度に「有用な」クエリであるとは思いません。あなたは何をしましたか希望それは何をしますか?