【问题标题】:SQL Query for Last Names with Apostrophes带撇号的姓氏的 SQL 查询
【发布时间】:2010-11-11 15:44:35
【问题描述】:

我有一个包含姓氏、名字、地址等的数据库。

我正在尝试按姓氏进行搜索,并且转义撇号没有问题,例如,表中的数据是“O'Malley”,如果我搜索“O'Malley”,我会得到预期的结果.

但是,我还希望能够搜索“omalley”并仍然从表中返回“O'Malley”记录。有什么办法可以忽略表格中的撇号?

或者,我唯一的其他选择是创建一个去掉撇号的姓氏字段,然后使用和 OR 语句来检查两者。

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    尝试类似:

    SELECT * -- replace with appropriate field list
    FROM MyTable
    WHERE LOWER(REPLACE(column_name,'''','')) = 'omalley'
    

    编辑 - 更正了 REPLACE 语法

    【讨论】:

    • 班尼斯特:将列设置为 ci ?
    • @ajreal:你能澄清你的评论吗?
    • 这对我来说似乎是最好的答案。
    • lower 如果列 collat​​e 是 xxx_ci 则不需要,除非您想明确地将其设为 cs
    • @ajreal:我明白你的意思 - 我的假设是 cs 在表上既是默认的也是期望的(通常),但是对于这个特定的查询(可能还有其他一些),cs 不是有帮助。
    【解决方案2】:

    您可能可以检查 REPLACE('''','',column_name) 值并为自己保存一个额外的“可索引”列。

    【讨论】:

    • 我不确定你的意思......因为表格有撇号,而且搜索词可能没有,所以我不能从搜索词中删除它。
    • SELECT desired_columns FROM table WHERE last_name='' OR REPLACE('''','',last_name)='' 不确定您的比较方式(精确或部分) 但这应该给你的想法。虽然您也可以对搜索词进行字符串替换并将撇号设为 % 并使用 LIKE 比较器。
    • $query = "SELECT * FROM meminfo WHERE LOWER(REPLACE('''','',lname)) = 'omalley'";这不会返回任何结果。有什么问题吗?
    • @Brian,我认为这些论点的顺序错误 - 应该是 $query = "SELECT * FROM meminfo WHERE LOWER(REPLACE(lname,'''','')) = 'omalley'"
    【解决方案3】:

    如果您的数据库支持 SOUNDEX - 您可以搜索“听起来”像 omalley 的名称。当您想尝试快速找到人并且不必询问如何拼写某些内容时,Soundex 真的很有帮助...More about Soundex

    例如,我看到 Thomas 的名字拼写为 Tomas、Tomes、Tomus - 尽管所有拼写不同,但 soundex 会找到它 - 因为它们都“听起来相同”。尤其是现在,当人们正在寻找不同的方式来拼写常用名称时,这会很有帮助。

    【讨论】:

      【解决方案4】:

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

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

      如果你不熟悉正则表达式中的?,它的意思是“这个字符可以出现在这里,但不是必须的”。例如,colou?r 将匹配“color”和“color”。

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

      【讨论】:

      • 现在我想了想,我不确定这是否是对您所提问题的回答。
      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多