2016-08-14 39 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