【问题标题】:Query that ignore the spaces忽略空格的查询
【发布时间】:2011-02-12 04:30:46
【问题描述】:

什么是运行查询的最佳方式,以便字段中的空格 忽略?例如以下查询:

SELECT * FROM mytable WHERE username = "JohnBobJones"    
SELECT * FROM mytable WHERE username = "John Bob Jones"

会找到以下条目:

John Bob Jones
JohnBob Jones
JohnBobJones

我使用的是 php 或 python 但我认为这无关紧要。

【问题讨论】:

  • PostgreSQL 还是 MySQL?在每种情况下,最佳解决方案可能会有所不同。尝试编写同时适用于两者的东西通常会导致查询缓慢。

标签: sql mysql database postgresql


【解决方案1】:
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')

【讨论】:

  • 您还可以将 REPLACE() 函数与 LIKE 运算符和通配符一起使用。例如: SELECT * FROM mytable REPLACE(username, ' ', '') LIKE REPLACE("John B%", ' ', '');
【解决方案2】:

这取决于。如果您不关心良好的性能,那么您可以做很多事情,但其中大多数会很慢。也许这对你来说没问题,但我会在这里留下这个答案,以防其他阅读者确实想要一个快速的解决方案。

如果你想要非常快的性能,你应该索引数据库中没有空格的字符串。在 PostgreSQL 中你可以create an index on a function。您可以使用它在列上创建索引,并将空格替换为空字符串。这种方法的优点是除了创建索引不需要维护。

在 MySQL 中你不能这样做,所以最简单的方法是复制数据库中的数据——一次有空格,一次没有。在 WHERE 子句中使用不带空格的列,但在 SELECT 列列表中使用原始列。这需要更多的维护,因为列必须保持同步。您可以使用应用程序逻辑或数据库触发器来做到这一点。

【讨论】:

  • 好点,我刚刚在邮政编码搜索中尝试了 mySQL REPLACE,哇...速度很慢...谢谢您的提示!
  • “功能索引”是这个答案非常有价值的部分 - 谢谢
【解决方案3】:

建议的解决方案看起来非常好,但性能却很糟糕,如果可以通过以下方式限制查询:

SELECT * FROM mytable 
    WHERE username like 'John%' and REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')

你也可以使用正则表达式:

SELECT * FROM mytable 
    WHERE username REGEXP '^John *Bob *Jones'

并记住性能,操作在哪里一般都是坏主意。

看看http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

【讨论】:

    【解决方案4】:

    试试这个:

    SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '')
    

    【讨论】:

    • 找不到JohnBob Jones
    【解决方案5】:

    我们经常想搜索文本,不管空格、空格和字母的数量。

    只需修剪,小写,并替换所有多个非单词字符为一个空格。

    SELECT regexp_replace(trim(lower('Here is              a            long               text               , with            many                 white spaces         AND             different                 character              sensitive')),'\W+',' ','g') t 
    

    return :这是一个长文本,有很多空格和不同的字符敏感

    这里是搜索的用途。只有单词的顺序很重要,仅此而已。这很漂亮。

    select * from (
    SELECT regexp_replace(trim(lower('Here is              a            long               text               , with            many                 white spaces         AND             different                 character              sensitive')),'\W+',' ','g') t 
    ) as o
    where t= regexp_replace(trim(lower('Here  is a LonG      TEXT , with            mANY white   ^    spaces         AND           different  character              sensiTive')),'\W+',' ','g')
    

    return:这是一个长文本,有很多空格和不同的字符敏感

    数据中的垃圾和查询中的垃圾,但它仍然认为它是正确的。

    【讨论】:

      【解决方案6】:

      一种方法是使用 LIKE 和 WildCards 来构建您的查询条件。比如:

      SELECT * FROM mytable WHERE username LIKE 'JohnBobJones';

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-24
        • 2015-02-18
        • 1970-01-01
        相关资源
        最近更新 更多