2012-10-12 37 views
2

匹配我有这样的代码,返回的结果我想:MySQL的通配符与CONCAT

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

下面是结果:

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

但使用像当试图在相同的字符串进行搜索时(我想在任何地方搜索字符串变量上面的结果里),我没有得到任何输出,并没有任何错误:

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

我是否正确使用LIKE操作数,还是在搜索结果中有更好/正确的搜索方式?

+0

如果将'where'子句更改为'having'会发生什么?我不确定这些值是否存在用于连接。 – ethrbunny

+0

这是有效的SQL,并且应该得到你想要的。你收到的错误是什么? –

+1

@ tomtheman5:“*我没有输出并且没有错误*”。不过,我同意OP应该得到他想要的东西:http://sqlfiddle.com/#!2/2734e/1/0(除非连接的排序规则区分大小写)。 – eggyal

回答

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 

或使用排序规则(取决于您的系统上)

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

“* MySQL的'LIKE'语句区分大小写。*” - 否,不是。这取决于操作数的整理。 – eggyal

+0

@eggyal虽然LIKE不区分大小写 - 在这种情况下它似乎是。请尝试这个例子,看看你自己。 – CoffeeMonster

+0

在我的情况下,它似乎确实是个案感染。我将使用上面的代码来转换案例并整理整个事情。非常感谢你! – user1497049

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'在每个字段的开始,而不是内的一些子他们。

+0

这里的第一个解决方案实际上效果更好。谢谢! – user1497049

+0

@ user1497049:您可能想要调查为什么默认为区分大小写的排序规则。也许检查桌子的设计和你的连接设置。 – eggyal