Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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 - Fatal编程技术网

忽略单词之间的空格-一个SQL问题

忽略单词之间的空格-一个SQL问题,sql,Sql,我想从数据库中获取一个名为“John Doe”的记录 我希望我的查询也能抓取'John(4个空格之间的)Doe','John(2个空格之间的)Doe'等(但至少有一个空格) 我也希望这个案子无关紧要,所以我也可以通过打字得到“约翰·多伊” “约翰·多伊”等。试试这个: SELECT * FROM table WHERE lower(NAME) like 'john%doe%' 使用like和通配符(例如%)来绕过空格,使用小写(或大小写)不区分大小写 编辑: 正如评论人士指出的那样,这种解决方

我想从数据库中获取一个名为“John Doe”的记录

我希望我的查询也能抓取'John(4个空格之间的)Doe','John(2个空格之间的)Doe'等(但至少有一个空格)

我也希望这个案子无关紧要,所以我也可以通过打字得到“约翰·多伊” “约翰·多伊”等。

试试这个:

SELECT * FROM table WHERE lower(NAME) like 'john%doe%'
使用like和通配符(例如%)来绕过空格,使用小写(或大小写)不区分大小写

编辑:
正如评论人士指出的那样,这种解决方案有两个缺点

首先:在这个查询中,您将选择“johnny doe”或更糟的“john Eldoe”,或更糟的“john macadolt”,因此您需要在应用程序端进行额外的筛选

第二:使用函数可能导致表扫描而不是索引扫描。如果dbms支持基于函数的索引,则可以避免这种情况。请参见尝试以下操作:

SELECT * FROM table WHERE lower(NAME) like 'john%doe%'
使用like和通配符(例如%)来绕过空格,使用小写(或大小写)不区分大小写

编辑:
正如评论人士指出的那样,这种解决方案有两个缺点

首先:在这个查询中,您将选择“johnny doe”或更糟的“john Eldoe”,或更糟的“john macadolt”,因此您需要在应用程序端进行额外的筛选


第二:使用函数可能导致表扫描而不是索引扫描。如果dbms支持基于函数的索引,则可以避免这种情况。请参见

在sql中,您可以使用通配符,这是一种替代其他字符的字符。例如:

select * from table where name like 'john%doe'
无论中间有多少个字符,都将选择以john开头并以doe结尾的所有名称


解释更多内容并给出一些选项。

在sql中,可以使用通配符,这是一种替代其他字符的字符。例如:

select * from table where name like 'john%doe'
无论中间有多少个字符,都将选择以john开头并以doe结尾的所有名称


详细说明并提供一些选项。

如果数据库具有替换功能

Select * From Table
Where Upper(Replace(name, ' ', '')) = 'JOHNDOE' 
其余的将返回行,其中John和Doe之间的中间部分是任何内容,而不仅仅是空格

如果您的数据库具有左功能和反转功能,请尝试

Select * From Table
Where left(Upper(name), 4) = 'JOHN' 
   And Left(Reverse(Upper(name), 3)) = 'EOD' 
否则使用子字符串和反向

Select * From Table
Where substring(Upper(name), 4) = 'JOHN' 
   And substring(Reverse(Upper(name), 3)) = 'EOD' 
或者像接线员一样

Select * From Table
Where Upper(name) Like 'JOHN%DOE'

如果您的数据库具有替换功能

Select * From Table
Where Upper(Replace(name, ' ', '')) = 'JOHNDOE' 
其余的将返回行,其中John和Doe之间的中间部分是任何内容,而不仅仅是空格

如果您的数据库具有左功能和反转功能,请尝试

Select * From Table
Where left(Upper(name), 4) = 'JOHN' 
   And Left(Reverse(Upper(name), 3)) = 'EOD' 
否则使用子字符串和反向

Select * From Table
Where substring(Upper(name), 4) = 'JOHN' 
   And substring(Reverse(Upper(name), 3)) = 'EOD' 
或者像接线员一样

Select * From Table
Where Upper(name) Like 'JOHN%DOE'

通配符将匹配零个字符,因此如果您至少需要一个空格,则应该这样做

select * from table where lower(name) like 'john %doe'

通配符将匹配零个字符,因此如果您至少需要一个空格,则应该这样做

select * from table where lower(name) like 'john %doe'
在Oracle中,您可以执行以下操作:

SELECT * FROM table
WHERE UPPER(REGEXP_REPLACE(NAME,'( ){2,}', ' ') = 'JOHN DOE';
没有“john mordoe”等误报。在Oracle中,您可以执行以下操作:

SELECT * FROM table
WHERE UPPER(REGEXP_REPLACE(NAME,'( ){2,}', ' ') = 'JOHN DOE';
MYSQL中没有“john mordoe”等误报。

select user_name from users where lower(trim(user_name)) regexp 'john[[:blank:]]+doe' = 1;
说明:

在上述情况下,用户名与正则表达式john(一个或多个空格)doe匹配。比较不区分大小写,trim负责字符串前后的空格

如果搜索字符串包含特殊字符,则需要对其进行转义。mysql文档中的更多信息:

在mysql中:

select user_name from users where lower(trim(user_name)) regexp 'john[[:blank:]]+doe' = 1;
说明:

在上述情况下,用户名与正则表达式john(一个或多个空格)doe匹配。比较不区分大小写,trim负责字符串前后的空格


如果搜索字符串包含特殊字符,则需要对其进行转义。mysql文档中的更多内容:

注意,但是,这也会产生诸如“johnny doe”或更糟的“john Eldoe”,或更糟的“john Macadolt”等条目。在前%的两侧添加一个空格将解决所提到的一些问题。@mjv:非常好,最好用空字符串替换所有空格,并与“johndoe”进行比较另一个建议(如果适用/可能)是在SQL级别使基础表/列不区分大小写,从而避免lower()调用,这对查询性能有许多负面影响(包括可能需要扫描整个表/索引,具体取决于特定的dbms/版本)@kurosch yes/right(有点…)我注意到,我认为任何一侧的%都可能使块上的好男孩不合格,即标准化的“john doe”(只有一个空格而不是两个!).另一方面,您删除所有空格的建议在计算上是昂贵的(并进一步导致扫描),而且在语义上也是错误的:例如:
“Alric Hardson”
vs.“Alrichardson”`vs.
“Al Richardson”
这些“简单的”可能会很棘手,不是吗;-)注意,但是,这也会产生如下条目“johnny doe”或更糟的“john Eldoe”,或更糟的“john Macadoelt”等。在第一个%的任一侧添加一个空格将解决一些提到的问题。@mjv:很好的一点,可能最好用空字符串替换所有空格,并与“johndoe”的另一个建议进行比较(如果适用/可能)在SQL级别,底层表/列不区分大小写,因此避免了lower()调用,这对查询性能有很多负面影响(包括可能需要扫描整个表/索引,具体取决于特定的dbms/版本)@kurosch yes/right(排序…)我注意到,我认为任何一方的%都可能会取消区块上的好男孩的资格,即标准化的“john doe”(只有一个空格,而不是两个!)。另一方面,您删除所有空格的建议在计算上是昂贵的(并进一步导致扫描),在语义上也是错误的:例如:
“Alric Hardson”
vs.“Alrich Hardson”“`vs.
“Al Richardson”
这些“简单的”可能很棘手,不是吗;-)与接受的答案一样,请注意这也会返回许多您可能没有预料到的结果(例如,john mordoe)。与接受的答案一样,请注意这也会返回许多r