为什么我的LIKE'%\ _'查询会返回所有行,而不仅仅是以下划线结尾?

时间:2009-01-27 11:11:26

标签: sql postgresql

我目前在Postgres上运行查询:

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' 

我做错了什么?

4 个答案:

答案 0 :(得分:16)

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

你还有更多的单字符用户名吗?如果反斜杠没有通过PostgreSQL,那么它们也会匹配'_'

您可以尝试ESCAPE clauseusername LIKE '%!_' ESCAPE '!'

答案 1 :(得分:5)

"_"是大多数SQL变体中的单字符通配符。如果要匹配实际的"_"字符,则必须将其转义。

答案 2 :(得分:2)

我用过postgres已经有一段时间了,但我认为你可以'%[_]'来获得你想要的东西。这肯定适用于SQL服务器,虽然我现在没有postgres数据库设置来尝试

答案 3 :(得分:2)

您必须使用双精度替换查询中的反斜杠,如下所示:

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

您仍然可以在字符串文字警告中非标准地使用\\,但查询将被执行。
在Postgres 8.4中测试。