忽略空格的查询

时间:2010-04-25 20:57:00

标签: sql mysql database postgresql

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

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

会找到以下条目:

John Bob Jones
JohnBob Jones
JohnBobJones

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

6 个答案:

答案 0 :(得分:59)

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

答案 1 :(得分:11)

这取决于。如果你不关心良好的表现,那么你可以做很多事情,但大多数都会很慢。也许这对你没关系,但我会在这里留下这个答案,以防其他人阅读时想要快速解决方案。

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

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

答案 2 :(得分:2)

建议的解决方案看起来非常好但是对于性能来说很糟糕,如果有可能使用类似

之类的限制查询

SELECT * FROM mytable     用户名如'John%'和REPLACE(用户名,'','')= REPLACE(“John Bob Jones”,'','')

您也可以使用REGEXP。

SELECT * FROM mytable     用户名REGEXP'^ John * Bob * Jones'

并且记住表现,操作在哪里一般都是坏主意。

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

答案 3 :(得分:1)

尝试这个:

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

答案 4 :(得分:0)

我们经常想要搜索文本,无论空格数,空格和字母数。

修剪,小写,并替换一个空格的所有多字非字字符。

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:这是一个包含许多空格和不同字符敏感的长文本

查询中的数据和垃圾中的垃圾,但仍然可以找到它。

答案 5 :(得分:-3)

一种方法是使用LIKE和WildCards来构建查询条件。类似的东西:

SELECT * FROM table WHERE username LIKE'John Bob Jones';