MySQL magic列“名称”和合成列
问题描述:
所以我得到了一条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上。
答
我不知道为什么你这个上来,但通常别人有麻烦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
答
创建一个子查询,然后把其中的子查询
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
谢谢!我必须做这个舞会的原因是我不得不和一个没有正确编码配置的数据库进行交谈。我在我的SQL上很生疏。 – Julik 2013-04-06 19:51:55