2012-11-05 79 views
-1

這將在MySQL 5做工精細:在MySQL 4別名爲了不工作BY子句

SELECT INSTR(foo, 'Bar') as foobar 
FROM Table 
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC; 

卜,我得到的錯誤:

ERROR 1054 (42S22): Unknown column 'foobar' in 'order clause' 

但是,如果我改變子句這,它將在兩個版本上工作:

SELECT INSTR(foo, 'Bar') as foobar 
FROM Table 
ORDER BY CASE WHEN INSTR(foo, 'Bar') = 1 THEN foo END DESC; 

爲了確保兼容性,我必須始終使用第二種方式嗎?

+0

重複http://stackoverflow.com/questions/10799558/invalid-column-name- order by-on-alias-of-subquery –

+0

感謝@stackmonster,我不知道如何描述錯誤。 – vmassuchetto

+0

肯定不直觀。 –

回答

1

因爲foobar是別名。它不是一列,除非它源自查詢(子查詢)的。像thisone下面

SELECT * 
FROM 
(
    SELECT INSTR(foo, 'Bar') as foobar 
    FROM Table 
) a 
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC; 
1

基本上你不能在相同的「查詢級別的」重新使用列別名。

如果你想要寫兼容/可移植的SQL,並且不想重複函數調用,那麼通常的做法是將查詢包裝到派生表中。

select * 
from (
    SELECT INSTR(foo, 'Bar') as foobar, 
     foo 
    FROM Table 
) t 
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC; 

請注意,您需要包括要在內部查詢裏面的「外部」查詢中使用任何列。如果省略內部派生表中的列foo,則可以在外層訪問它,而不是而不是

1

根據其他答案,您不能在CASE中使用別名。
而不是使用子查詢,你可以在CASE像這樣直接使用INSTR()的:

SELECT INSTR(foo, 'Bar') as foobar 
FROM Table 
ORDER BY CASE WHEN INSTR(foo, 'Bar') = 1 THEN foo END DESC; 

當您使用子查詢,則請注意,您也將有選擇foo柱通過它,其他明智的命令你會得到一個錯誤like this

因此,與子查詢的查詢應該是:

SELECT * FROM 
(
    SELECT foo,INSTR(foo, 'Bar') as foobar 
    FROM t 
) A 
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC; 
+0

謝謝,但我已經有了這個解決方案,我認爲這可能是一個更好的方法。其他答案涵蓋了爲什麼我不能重用'foobar'。 – vmassuchetto

+0

@ViniciusMassuchetto這很好:)。但請參閱更新的答案以獲取其他說明。 – hims056