2012-04-10 83 views
3

下面的查询从表中names如何根据CASE语句的值编写WHERE语句?

SELECT 
    CASE 
     WHEN nickname = '' THEN fullname ELSE nickname END AS new_name,  
    FROM names 

我尝试使用下面的查询

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

通过new_name搜索但我得到的错误返回结果集的所有new_name

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

有没有办法让我的这个功能在没有使用子查询的情况下工作?

+0

你有一个错字 - ;在from子句之后。它呢? – 2012-04-10 01:16:27

+0

不是mysql已经合并? – 2012-04-10 01:19:29

+0

@SteveMallory - 好,但我不认为这是问题所在。为了举例,我简化了查询,并在此过程中创建了一个错字 – user784637 2012-04-10 01:20:15

回答

5

如果您在where子句中重复case,声明将工作:

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%') 

这将返回相同的结果,但如果你定义它们可以在nicknamefullname使用索引,编辑和改变的第二个操作数LIKE不使用领先的%

+0

,谢谢dasblinkenlight。我在自动完成中在按​​键和查询的执行之间有0个延迟,所以在第二个例子中的速度升级正是我所期待的! – user784637 2012-04-10 01:23:30

+0

+1考虑性能 – cctan 2012-04-10 01:25:57

+0

这也不会使用索引! ''LIKE'在值以'%'开始时不使用索引,并且即使可以,它也只能使用*一个*索引,'OR'不能使用索引 – Bohemian 2012-04-10 01:29:56

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

1

对我来说更有意义,使用COALESCE函数替换列名,假设昵称或者是NULL或填充...

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