如何根据CASE语句的值编写WHERE语句?

时间:2012-04-10 01:13:31

标签: mysql

以下查询返回表new_name

中所有names的结果集
SELECT
    CASE
        WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,       
    FROM names

我正在尝试使用以下查询new_name进行搜索

SELECT
    CASE
        WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,       
    FROM names
    WHERE new_name LIKE '%Joh%'

但是我收到了错误

'where子句'中的未知列'new_name'

我是否有办法在不使用子查询的情况下使用此功能?

3 个答案:

答案 0 :(得分:5)

如果您重复case子句中的where,该语句将起作用:

SELECT
CASE
    WHEN nickname = '' THEN fullname ELSE nickname END AS new_name      
FROM names
WHERE (CASE WHEN nickname = '' THEN fullname ELSE nickname END) LIKE '%Joh%'

它不会很快,因为它不会使用索引,但它应该可以工作。

更好的方法如下:

SELECT
CASE
    WHEN nickname = '' THEN fullname ELSE nickname END AS new_name      
FROM names
WHERE (nickname like '%Joh%') or (fullname LIKE '%Joh%')

这将返回相同的结果,但是如果您定义了<{1}}和nickname,可以使用编辑并更改{{1}的第二个操作数}不要使用前导fullname

答案 1 :(得分:2)

SELECT
    CASE
        WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,       
    FROM names
    WHERE 
       (CASE
        WHEN nickname = '' THEN fullname ELSE nickname END) LIKE '%Joh%';

将列名替换为整个case ... when ... then ... end

答案 2 :(得分:1)

对我来说,使用合并函数更有意义,假设昵称是NULL或填充...

SELECT COALESCE(nickname,filename)
FROM   table
WHERE COALESCE(nickname,filename) LIKE '%JOE%'