【发布时间】:2010-11-11 15:44:35
【问题描述】:
我有一个包含姓氏、名字、地址等的数据库。
我正在尝试按姓氏进行搜索,并且转义撇号没有问题,例如,表中的数据是“O'Malley”,如果我搜索“O'Malley”,我会得到预期的结果.
但是,我还希望能够搜索“omalley”并仍然从表中返回“O'Malley”记录。有什么办法可以忽略表格中的撇号?
或者,我唯一的其他选择是创建一个去掉撇号的姓氏字段,然后使用和 OR 语句来检查两者。
【问题讨论】:
我有一个包含姓氏、名字、地址等的数据库。
我正在尝试按姓氏进行搜索,并且转义撇号没有问题,例如,表中的数据是“O'Malley”,如果我搜索“O'Malley”,我会得到预期的结果.
但是,我还希望能够搜索“omalley”并仍然从表中返回“O'Malley”记录。有什么办法可以忽略表格中的撇号?
或者,我唯一的其他选择是创建一个去掉撇号的姓氏字段,然后使用和 OR 语句来检查两者。
【问题讨论】:
尝试类似:
SELECT * -- replace with appropriate field list
FROM MyTable
WHERE LOWER(REPLACE(column_name,'''','')) = 'omalley'
编辑 - 更正了 REPLACE 语法
【讨论】:
lower 如果列 collate 是 xxx_ci 则不需要,除非您想明确地将其设为 cs
您可能可以检查 REPLACE('''','',column_name) 值并为自己保存一个额外的“可索引”列。
【讨论】:
$query = "SELECT * FROM meminfo WHERE LOWER(REPLACE(lname,'''','')) = 'omalley'"
如果您的数据库支持 SOUNDEX - 您可以搜索“听起来”像 omalley 的名称。当您想尝试快速找到人并且不必询问如何拼写某些内容时,Soundex 真的很有帮助...More about Soundex
例如,我看到 Thomas 的名字拼写为 Tomas、Tomes、Tomus - 尽管所有拼写不同,但 soundex 会找到它 - 因为它们都“听起来相同”。尤其是现在,当人们正在寻找不同的方式来拼写常用名称时,这会很有帮助。
【讨论】:
将' 的所有实例替换为'? 并使用REGEXP。
SELECT *
FROM person
WHERE name REGEXP 'o\'?malley'
如果你不熟悉正则表达式中的?,它的意思是“这个字符可以出现在这里,但不是必须的”。例如,colou?r 将匹配“color”和“color”。
注意:此解决方案适用于 MySQL,但我不知道您使用的是什么 DBMS。
【讨论】: