【问题标题】:SELECT to match special characters and caseSELECT 匹配特殊字符和大小写
【发布时间】:2015-07-07 08:03:34
【问题描述】:
table 中的

字段 X 可能包含特殊字符,例如 hello!World,我想知道是否有办法匹配它HelloWorld(忽略大小写和特殊字符)。
SELECT * FROM table WHERE X='Helloworld'

【问题讨论】:

标签: mysql regex select


【解决方案1】:

http://sqlfiddle.com/#!9/2afa1/1

如果您需要字符串的精确匹配:

SELECT * 
FROM table1
WHERE x REGEXP '^hello[[:punct:],[:space:]]world$';

如果hello world 可以是更大字符串的一部分:

SELECT * 
FROM table1
WHERE x REGEXP 'hello[[:punct:],[:space:]]world';

【讨论】:

  • 问题是我不知道特殊字符在字符串中的位置,@fancyPants 回答成功了
  • 这取决于您,下次询问时您应该澄清一下。我的答案正是您所要求的。
【解决方案2】:

你可以做的是像这样替换所有特殊字符:

SELECT * FROM table WHERE LOWER(REPLACE(X, '!', '')) = LOWER('HelloWorld');

如果您必须替换更多,请链接这些替换:

SELECT * FROM table WHERE LOWER(REPLACE(REPLACE(X, '!', ''), '?', '')) = LOWER('HelloWorld');

【讨论】:

  • 然后还有一千个 REPLACE() 调用 :) 抱歉,我没有意识到原始帖子中包含合理数量的“特殊”字符。作为一个通用解决方案,我认为它效果不佳
【解决方案3】:

如果我理解你的问题,你需要过滤掉非 ASCII 字符吗?请确认这是否属实。为此,请查看评论链接和this 问题中的 REGEXP 匹配。

试试类似的东西

SELECT * FROM `table ` WHERE `X` REGEXP 'Helloworld';

【讨论】:

  • Helloworld 不匹配 hello!World
  • 是的,但这并不能解决问题,我仍然不明白这一行
  • @Toto:你说得对,答案不对。不知道删除它是否更好。这里有关于过滤非字母字符的讨论:stackoverflow.com/questions/6942973/…。正如公认的答案所说,最好存储过滤后的值。然后我们不需要在每个查询上过滤每一行(巨大的性能缺陷),它可以被索引。
【解决方案4】:
REGEXP 'hello[^[:alpha:]]*world'

注意事项:

  • 这会在其他东西的中间找到字符串;添加 ^ 和 $ 以锚定到结尾。
  • 这假定非字母字符介于 helloworld 之间,而不是字符串中的其他位置。
  • 这依赖于相关的排序规则来进行(或不进行)大小写折叠。

【讨论】:

  • 问题是我不知道特殊字符在字符串中的位置,@fancyPants 回答成功了
猜你喜欢
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 2010-11-08
相关资源
最近更新 更多