Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 忽略空格的查询_Sql_Mysql_Database_Postgresql - Fatal编程技术网

Sql 忽略空格的查询

Sql 忽略空格的查询,sql,mysql,database,postgresql,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,但我认为这并不重要。一种方法是使用LIKE和通配符来构建查询ci

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

SELECT * FROM mytable WHERE username = "JohnBobJones"    
SELECT * FROM mytable WHERE username = "John Bob Jones"
将找到以下条目:

John Bob Jones
JohnBob Jones
JohnBobJones

我正在使用php或python,但我认为这并不重要。

一种方法是使用LIKE和通配符来构建查询citeria。比如:

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

从mytable中选择*用户名,如“JohnBobJones”

视情况而定。如果你不在乎好的表现,那么你可以做很多事情,但大多数都会很慢。也许这对你来说没关系,但我会把这个答案留在这里,以防其他读者想要一个快速的解决方案

如果您想要非常快的性能,您应该在数据库中索引不带空格的字符串。在PostgreSQL中,您可以。可以使用此选项在列上创建索引,并将空格替换为空字符串。这种方法的优点是,除了创建索引外,不需要维护

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

尝试以下操作:

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

建议的解决方案看起来很好,但性能很差,如果可能的话,可以使用以下方式限制查询:

SELECT * FROM mytable 
    WHERE username like 'John%' and REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '')
您还可以使用REGEXP:

SELECT * FROM mytable 
    WHERE username REGEXP '^John *Bob *Jones'
并记住性能,在哪里操作一般都是坏主意


看看

我们通常希望搜索文本,而不考虑空格、空格和字母的数量

只需修剪、小写并替换一个空格中的所有多个非单词字符

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


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

PostgreSQL还是MySQL?在每种情况下,最佳解决方案可能不同。尝试编写在这两种情况下都有效的东西通常会导致查询速度变慢。很好,我刚刚在邮政编码搜索中尝试了mySQL替换,哇。。。它很慢。。。谢谢你的提示!还可以将REPLACE()函数与LIKE运算符和通配符一起使用。例如:从mytable REPLACE(用户名,,'')中选择*如REPLACE(“John B%”,'');找不到JohnBob Jones