2013-03-19 83 views
2

我有这个疑问MySQL的条件选择基于查询的WHERE子句

SELECT column1 FROM Table1 WHERE column1 LIKE CONCAT('%', :regex, '%') OR (column2 IS NOT NULL AND column2 LIKE CONCAT('%', :regex, '%') 

返回总是column1值如果Table1满足创纪录的where子句。但我想要的是,如果满足where子句的第一部分LIKE CONCAT('%', :regex, '%'),则返回column1值,如果满足第二部分(column2 IS NOT NULL AND column2 LIKE CONCAT('%', :regex, '%'),则返回column2值。 我应该如何修改查询来实现这个结果?

回答

3

一种选择是使用CASE声明:

SELECT 
    CASE 
     WHEN column1 LIKE CONCAT('%', :regex, '%') THEN column1 
     ELSE column2 
    END yourcolumn 
FROM Table1 
WHERE column1 LIKE CONCAT('%', :regex, '%') 
    OR (column2 IS NOT NULL AND column2 LIKE CONCAT('%', :regex, '%') 
+0

大,查询的工作原理是我想要的。但是我还有一个问题与你的答案有关:在你的查询中,相同的比较会执行两次,一次是选择,另一次是在哪里。只有两种之一可以优化查询吗? – LuckyStarr 2013-03-20 09:20:24