2016-08-14 4 views
0

私はこのようなクエリがあります:あなたが見たよう条件が同じ場合、CASE文を複数の列に対して一度使用するにはどうすればよいですか?

SELECT (CASE WHEN subject = '' THEN $subject ELSE subject END) main_subject, 
     (CASE WHEN subject = '' THEN $id ELSE id END) main_id, 
     (CASE WHEN subject = '' THEN $related ELSE related END) main_related 
FROM qanda 
WHERE tag = :tag; 

を、条件は全ての条件で同じ..ですだから私は知りたい、私はそれを改善することができますか?すべてのケースで1回だけCASEと書くことができますか?

+0

これを正しく実行しました。 –

+0

'subject = '''を使ってテーブルの各行に対して結果に重複した行を入れたいのですが? –

+0

@PaulSpiegel私は重複する行がありません。 – stack

答えて

2

コードは問題ありません。あなたが本当にしたい場合、あなたが行うことができます:

SELECT $subject as main_subject, $id as main_id, $related as main_related 
FROM qanda 
WHERE tag = :tag AND subject = '' 
UNION ALL 
SELECT subject as main_subject, id as main_id, related as main_related 
FROM qanda 
WHERE tag = :tag AND (subject <> '' or subject IS NULL) 

これはCASE文を取り除きますが、私はそれが本当の単純化であるとは思いません。ただし、条件をコピーする必要がある回数を減らすことができます。これは、多数の列がある場合は単純化することができます。

+0

ありがとう.. upvote – stack

+0

ただ一つのこと。ご存じのように、あなたのクエリの最初の 'SELECT'ステートメントは' qanda'テーブルの何も選択しません、なぜ 'FROM qanda'ですか?あなたは 'FROM dual'を使うことができると思います。私は正しい? – stack

+1

@stackいいえ、それは同じではありません。この(とあなたの)クエリでは、 'subject = 0'を持つ行ごとにデフォルト値を持つ行が得られます。したがって、' quanda'に依存して0からnの間のものがあり、 'from quanda'が必要です。 'dual'を使うと、あなたのデフォルトを正確に1回追加します。 – Solarflare

関連する問題