2012-04-10 70 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%'