0

所以我得到了一条 SQL 语句。这个想法是我想做一个不区分大小写的 LIKE。我这样做:

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 上。

4

2 回答 2

1

我不知道你为什么想出这个,但通常其他人很难LIKE区分大小写,而不是反过来。

像这样简单地编写您的查询:

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

通常,您不能在 WHERE 子句中访问别名。将您的查询放入 Dhinakaran 建议的子查询或使用HAVING(如果您很懒惰)。

区别?WHERE是基于行HAVING的,在应用WHERE子句 (and GROUP BY) 之后处理结果。

手册

以下两个语句说明字符串比较不区分大小写,除非操作数之一是二进制字符串:

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1
mysql> SELECT 'abc' LIKE BINARY 'ABC';
        -> 0
于 2013-03-28T11:04:32.023 回答
0

创建一个子查询,然后将 where 放在子查询上

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
于 2013-03-28T10:49:07.137 回答