我想从db中获取一个名为='John Doe'的记录。
我希望我的查询也可以抓住'John(4个空格)Doe','John(2个空格)Doe'等(但至少有一个空格)。
我也希望案件无所谓,所以我也可以通过打字来获得'John Doe' 'john doe'等。
答案 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'等的误报。