2016-08-14 41 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; 

正如你看到的,條件是在所有條件下相同的。所以我想知道,我可以提高嗎?我的意思是我可以在所有情況下只寫一次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'的行,你會得到一行默認值,所以0到n之間的任何值都取決於'quanda',這就是爲什麼你需要'來自quanda'的原因。無論如何,使用'dual'都會將您的默認值添加一次。 – Solarflare