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

use*_*637 3 mysql

以下查询返回new_name表中所有结果集的结果集names

SELECT
    CASE
        WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,       
    FROM names
Run Code Online (Sandbox Code Playgroud)

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

SELECT
    CASE
        WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,       
    FROM names
    WHERE new_name LIKE '%Joh%'
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误

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

有没有一种方法可以在不使用子查询的情况下使用此功能?

das*_*ght 5

如果你casewhere条款中重复,该语句将起作用:

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%'
Run Code Online (Sandbox Code Playgroud)

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

一个更好的方法如下:

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

这将返回相同的结果,但它可以使用索引nickname,fullname如果您定义它们,编辑并更改第二个操作数LIKE以不使用前导%.