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