2013-03-28 41 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