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

时间:2009-10-29 15:45:14

标签: sql

我想从db中获取一个名为='John Doe'的记录。

我希望我的查询也可以抓住'John(4个空格)Doe','John(2个空格)Doe'等(但至少有一个空格)。

我也希望案件无所谓,所以我也可以通过打字来获得'John Doe' 'john doe'等。

6 个答案:

答案 0 :(得分:2)

试试这个:

SELECT * FROM table WHERE lower(NAME) like 'john%doe%'

与通配符(例如%)一样使用来绕过空格,而较低(orlcase)则不区分大小写。

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

首先:您将选择“johnny doe”或更糟的“john Eldoe”,或者更糟糕的是,“john Macadoelt”使用此查询,因此您需要在应用程序端进行额外过滤。

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

答案 1 :(得分:2)

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

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' 

或Like运算符

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

答案 2 :(得分:1)

在MYSQL中:

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

说明:

在上面的例子中,user_name匹配正则表达式john(一个或多个空格)doe。比较是不区分大小写的,trim会处理字符串之前和之后的空格。

如果搜索字符串包含特殊字符,则需要对其进行转义。有关mysql文档的更多信息:http://dev.mysql.com/doc/refman/5.5/en/regexp.html

答案 3 :(得分:0)

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

select * from table where name like 'john%doe'

将选择所有以john开头并以doe结尾的名称,无论其间有多少个字符。

This article解释了更多并提供了一些选择。

答案 4 :(得分:0)

通配符将匹配零个字符,因此如果您想要至少一个空格,那么您应该

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

答案 5 :(得分:0)

在Oracle中,你可以这样做:

SELECT * FROM table
WHERE UPPER(REGEXP_REPLACE(NAME,'( ){2,}', ' ') = 'JOHN DOE';

没有像'john mordoe'等的误报。