【问题标题】:Why does my query with LIKE '%\_' return all rows and not just those ending in an underscore?为什么我的 LIKE '%\_' 查询返回所有行,而不仅仅是那些以下划线结尾的行?
【发布时间】:2010-10-03 17:42:44
【问题描述】:

我目前在 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' 

我做错了什么?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    你的反斜杠没有进入 PostgreSQL 吗?如果您要通过将反斜杠视为转义字符(例如 Java 字符串)的另一层传递字符串,则该层可能正在删除反斜杠,您可能需要为该层转义反斜杠。

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

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

    【讨论】:

    • 我直接在服务器上运行查询,所以反斜杠可以通过。我刚刚尝试使用 ESCAPE 命令,这让它完全按照我想要的方式工作!
    • 在准备好的语句中插入字符串时,\_ 匹配下划线字符,但当 sql 语句有字符串字面量时,则需要 \\_。我猜这是因为第一个 \ 在字符串文字级别转义了第二个 \ ,然后在 postgres 级别它在字符串中看到 \_ 并将其与下划线字符匹配。
    • 这很大程度上取决于您对standard_conforming_strings 的设置,如果它被关闭,您需要将\ 加倍,并且应该将e 放在引号之前。如果开启,则只需要一个\
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不,postgres 中不存在对 SQL 的非标准扩展。
      【解决方案4】:

      您必须将查询中的反斜杠替换为双反斜杠,如下所示:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 2016-09-13
        • 2013-10-03
        • 2011-04-22
        • 1970-01-01
        相关资源
        最近更新 更多