2009-01-27 22 views
8

我目前对Postgres的查询运行:为什么我的LIKE'% _'查询返回所有行,而不只是那些以下划线结尾的行?

SELECT * FROM addenda.users WHERE users.username LIKE '%\_' 

反倒是然后返回只是一个下划线条目结束,我得到的所有结果回来,不管它是否包含一个下划线或没有。

运行下面的查询返回的用户名是只是一个下划线,所以转义做工作:

SELECT * FROM addenda.users WHERE users.username LIKE '\_' 

并运行下面的查询返回一个与特定的单词字母结尾的用户名:

SELECT * FROM addenda.users WHERE users.username LIKE '%s' 

我在做什么错?

回答

16

您的反斜杠没有通过PostgreSQL?如果您通过另一个将反斜杠作为转义字符(例如Java字符串)的图层传递字符串,那么该图层可能会删除反斜杠,并且您可能需要为该图层转义您的反斜杠。

您是否还有单字符用户名?如果反斜杠没有得到通过向PostgreSQL那么他们也将匹配'_'

你也许可以尝试ESCAPE clauseusername LIKE '%!_' ESCAPE '!'

+0

我直接在服务器上运行查询,所以反斜杠正在通过。我只是尝试使用ESCAPE命令,这使它工作正是我想要的! – 2009-01-27 11:44:15

+1

在准备好的语句中插入字符串时,`\ _`匹配下划线字符,但是当sql语句具有字符串字面值时,您需要`\\ _`来代替。我猜这是因为第一个'\`在字符串字面级别转义了第二个'\',然后在postgres级别,它在字符串中看到'\ _`,并将其与下划线字符相匹配。 – 2015-01-26 19:09:13

2

这已经有一段时间,因为我用的Postgres,但我认为你可以做'%[_]'来得到你想要的。这当然适用于SQL服务器,尽管我现在还没有postgres数据库设置来试用它

5

"_"是大多数SQL变体中的单字符通配符。如果你想匹配一个实际的"_"角色,你必须逃脱它。

2

你有一个双一个替换反斜线您的查询,如:

SELECT * FROM addenda.users WHERE users.username LIKE '%\\_'

你仍然可以得到一个非标准使用\\的一个字符串警告信息,但查询将被执行。
在Postgres中测试8.4。

相关问题