2013-03-28 46 views
0

所以我得到了一條SQL語句。這個想法是我想做一個不區分大小寫的LIKE。 我不喜歡這樣寫道:MySQL magic列「名稱」和合成列

SELECT 
    FilenameId AS id, 
    LOWER(CONVERT(BINARY(Filename.Name) USING utf8)) AS name 
    FROM Filename 
    WHERE name LIKE '%something%' 
    COLLATE utf8_general_ci 

這工作得很好,但是我的查詢也返回的情況下變換名稱。我想要做的事情 是合成不敏感的名稱,並對其執行LIKE查詢,但也返回非大小寫轉換的名稱。

SELECT 
    FilenameId AS id, 
    Filename.Name AS name, 
    LOWER(CONVERT(BINARY(Filename.Name) USING utf8)) AS iname 
    FROM Filename 
    WHERE iname LIKE '%something%' 
    COLLATE utf8_general_ci 

......但那麼MySQL高興地拒絕:

Unknown column 'iname' in 'where clause' 

我在做什麼錯?我在MySQL 5.5 FWIW上。

回答

1

我不知道爲什麼你這個上來,但通常別人有麻煩LIKE區分大小寫,而不是相反。

寫您的查詢只需像這樣:

SELECT 
FilenameId AS id, 
Filename.Name AS name 
FROM Filename 
WHERE name LIKE '%something%' 

而在一般情況下,你不能訪問別名WHERE子句。將您的查詢放入像Dhinakaran建議的子查詢中,或者使用HAVING(如果您是懶惰的)。

區別? WHERE是基於行的,HAVING在應用WHERE子句(和GROUP BY)後適用於結果。

manual

以下兩個語句舉例說明了字符串比較不區分大小寫,除非其中一個操作數是一個二進制字符串:

mysql> SELECT 'abc' LIKE 'ABC'; 
     -> 1 
mysql> SELECT 'abc' LIKE BINARY 'ABC'; 
     -> 0 
+0

謝謝!我必須做這個舞會的原因是我不得不和一個沒有正確編碼配置的數據庫進行交談。我在我的SQL上很生疏。 – Julik 2013-04-06 19:51:55

0

創建一個子查詢,然後把其中的子查詢

Select * from (SELECT 
    FilenameId AS id, 
    Filename.Name AS name, 
    LOWER(CONVERT(BINARY(Filename.Name) USING utf8)) AS iname 
    FROM Filename) temp 
    WHERE temp.iname LIKE '%something%' 
    COLLATE utf8_general_ci 

或者

SELECT 
    FilenameId AS id, 
    Filename.Name AS name, 
    AS iname 
    FROM Filename 
    WHERE LOWER(CONVERT(BINARY(Filename.Name) USING utf8)) LIKE '%something%' 
    COLLATE utf8_general_ci