2012-09-12 62 views
2

我是一个全新的,从未使用的案例,所以请不要笑。为什么这个MySQL CASE查询不起作用?

这个查询为什么不起作用?

SELECT * 
    FROM `cronjob_reloaded` 
    WHERE `carid` LIKE '%bmw%' 
     OR `age` BETWEEN '10' AND '15' 
ORDER BY 
    CASE WHEN `carid` LIKE '%bmw%' = 1 
     THEN 1 
    CASE WHEN `age` BETWEEN '10' AND '15' = 2 
     THEN 2 

我得到这个错误:

Check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE WHEN age BETWEEN '10' AND '15' =2 THEN 2

+2

为什么不起作用?你在期待什么,你会得到什么?请给我们一个数据,期望的输出和你得到的输出的例子。并请,我们不笑,我们在这里帮忙;) –

+0

我刚刚发布了mysql错误。 – webmasters

回答

4

你的语法有点奇怪。您不需要LIKE案例中的= 1案例,第二个条件具有无效的= 2,并且由于两者都具有相同陈述的条件,因此不要重复CASE - 而是从WHEN开始第二个条件。

还建议您输入ELSE大小写以确定性地匹配所有其他行。下面,我插入ELSE 3,这两个匹配条件后排序所有其他不匹配的行。

最后,整个结构应该以END关键字结尾。

SELECT * FROM `cronjob_reloaded` 
WHERE 
`carid` LIKE '%bmw%' 
OR 
`age` BETWEEN '10' AND '15' 
ORDER BY 
    CASE 
    WHEN `carid` LIKE '%bmw%' THEN 1 
    WHEN `age` BETWEEN '10' AND '15' THEN 2 
    /* Advisable to add an ELSE condition to catch all other rows */ 
    ELSE 3 
    END 
+0

我已经添加了END,但它没有工作,所以语法是错误的。 – webmasters

+0

@webmasters确保你的看起来像我的。不仅仅是“END”。 –

+0

@webmasters对不起,我刚刚注意到在我删除的第二个条件中有一个虚假的'= 2'。 –

2

你并不需要两个CASE。只需添加单CASE这样的:

ORDER BY 
CASE 
    WHEN `carid` LIKE '%bmw%' THEN 1 
    WHEN `age` BETWEEN '10' AND '15' THEN 2 
END 

你也写carid LIKE '%bmw%' = 1这是不对的。你应该写carid LIKE '%bmw%'

+0

'LIKE'%bmw%'= 1'是什么意思? –

+0

@JohnWoo哎呀!复制OP的条件。我刚刚更新了'CASE'的语法。谢谢并更新了答案。 – hims056

+1

'+ 1'很好的回答! –

0

号不需要引号,你也不必在CASE WHEN= 1条件下尝试此查询:

SELECT * 
FROM cronjob_reloaded 
WHERE carid LIKE '%bmw%' 
     OR age BETWEEN 10 AND 15 
ORDER BY (CASE WHEN carid LIKE '%bmw%' THEN 1 
       WHEN age BETWEEN 10 AND 15 THEN 2 
     END); 
0
SELECT * FROM `cronjob_reloaded` 
WHERE 
`carid` LIKE '%bmw%' OR 
`age` BETWEEN '10' AND '15' ORDER BY 
    CASE 
    WHEN `carid` LIKE '%bmw%' = 1 THEN 1 
    WHEN `age` BETWEEN '10' AND '15' = 2 THEN 2 
    END