MySQL通配符与concat匹配

时间:2012-10-12 17:21:15

标签: mysql sql-like concat

我有这个代码可以返回我想要的结果:

SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') AS result FROM client_detail 

结果如下:

#1 James Hadley (OpenBill)
#2 Lucinda Hadley (Make a Squish)

但是当使用LIKE尝试搜索相同的字符串时(我想在上面的结果中的任何地方搜索变量字符串),我没有输出也没有错误:

SELECT CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') AS result FROM client_detail WHERE CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')') LIKE '%jam%' ORDER BY id ASC

我使用LIKE操作数是对的,还是有更好/正确的搜索结果?

2 个答案:

答案 0 :(得分:1)

MySQL的CONCAT语句将使用系统默认值进行排序。如果您的表定义为 UTF-8 ,但您的系统是 latin1 ,那么您的LIKE语句可能会选择区分大小写的排序规则。

使用LOWER强制不区分大小写的匹配 (使用HAVING利用您的别名result):

SELECT CONCAT('#',id,' ',firstname,' ',lastname,' (', company, ')') AS result
  FROM client_detail 
HAVING LOWER(result) LIKE '%jam%'    
 ORDER BY id ASC

或使用COLLATION(取决于您的系统)

...
HAVING result LIKE '%jam%' COLLATE latin1_general_ci
...

答案 1 :(得分:0)

而不是转换大小写,这是一项昂贵的操作,而不是强制使用不区分大小写的排序规则:

SELECT   CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
           AS result
FROM     client_detail
WHERE    CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
           LIKE '%jam%' COLLATE utf8_general_ci
ORDER BY id ASC

但是,这仍然非常昂贵,因为它要求对表中的每个记录执行连接和搜索:索引是无用的。

也许可以重新调整查询以更好地利用索引(如果存在):

SELECT   CONCAT('#', id, ' ', firstname, ' ', lastname, ' (', company, ')')
           AS result
FROM     client_detail
WHERE    firstname LIKE 'jam%' COLLATE utf8_general_ci
      OR lastname  LIKE 'jam%' COLLATE utf8_general_ci
      OR company   LIKE 'jam%' COLLATE utf8_general_ci
ORDER BY id ASC

虽然此查询仅在每个字段的开头搜索'jam',而不是在其中包含某些子字符串。