带撇号的姓氏的SQL查询

3
我有一个包含姓氏、名字、地址等信息的数据库。
我想通过姓氏进行搜索,对于转义单引号我没有问题,例如,表格中的数据是“O'Malley”,如果我搜索“O'Malley”,我会得到预期的结果。
但是,我也想能够搜索“omalley”并从表格中返回“O'Malley”的记录。是否有办法忽略表格中的撇号?
或者,我的另一个选择是创建一个去掉撇号的姓氏字段,然后使用OR语句来检查两个字段。
4个回答

3
尝试类似以下内容:
SELECT * -- replace with appropriate field list
FROM MyTable
WHERE LOWER(REPLACE(column_name,'''','')) = 'omalley'

编辑 - 修正了REPLACE语法


班尼斯特:将列设置为 ci? - ajreal
@ajreal:你能否澄清一下你的评论? - user359040
这对我来说似乎是最好的答案。 - Jason Swett
如果列的排序规则是xxx_ci,那么除非你明确要将其设为cs,否则不需要使用lower函数。 - ajreal
@ajreal:我明白你的意思了——我的假设是在表格中,cs既是默认值,也是期望值(通常情况下),但对于这个特定的查询(以及可能还有其他一些查询),cs并没有什么帮助。 - user359040

2

您可以对 REPLACE('''','',column_name) 的值进行检查,并节省一个额外的“可索引”列。


我不确定你的意思是什么... 因为表格中有撇号,而搜索词可能没有,所以我无法从搜索词中去掉它。 - Brian
SELECT desired_columns FROM table WHERE last_name='<search_term>' OR REPLACE('''','',last_name)='<search_term>' 不确定您是如何比较(精确或部分),但这应该可以给您一个想法。虽然您也可以对搜索词进行字符串替换,并将撇号替换为%并使用LIKE比较器。 - Brad Christie
$query = "SELECT * FROM meminfo WHERE LOWER(REPLACE('''','',lname)) = 'omalley'"; 这个查询语句没有返回任何结果。它有什么问题吗? - Brian
@Brian,我认为参数顺序不对了——应该是$query = "SELECT * FROM meminfo WHERE LOWER(REPLACE(lname,'''','')) = 'omalley'" - user359040

1

如果您的数据库支持SOUNDEX - 您可以搜索与omalley“发音”相似的名称。当您想快速查找人员而不必询问如何拼写某些内容时,Soundex非常有帮助...了解更多关于Soundex

例如,我曾看到过将Thomas拼写为Tomas、Tomes、Tomus - 即使所有拼写方式都不同,但是Soundex会找到它们 - 因为它们都“听起来一样”。特别是现在人们正在寻找不同的拼写常见名称的方法时,这非常有帮助。


0

将所有'的实例替换为'?并使用REGEXP

SELECT *
  FROM person
 WHERE name REGEXP 'o\'?malley'

如果您不熟悉正则表达式中的?,它表示“此字符可以出现在此处,但不一定要出现”。例如,colou?r将匹配“color”和“colour”。

注意:此解决方案适用于MySQL,但我不知道您使用的是哪种DBMS。


现在我想想,我不确定这是否是你所问问题的答案。 - Jason Swett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接