【问题标题】:With JDBC, how do I search postgres text for a question mark?使用 JDBC,如何在 postgres 文本中搜索问号?
【发布时间】:2018-03-22 02:31:07
【问题描述】:

我正在通过 Clojure 使用 JDBC,并希望搜索我的 postgres 字段以了解它们是否确实包含问号,但无论我如何尝试转义或加倍问号,似乎都无法正常工作。

    (jdbc/query *db* "SELECT * FROM conversations WHERE full_text @@ to_tsquery('?')")
= > ()

【问题讨论】:

    标签: postgresql jdbc clojure escaping


    【解决方案1】:

    查询的文档似乎说参数应该是一个向量(就像在 Alan 的执行示例中一样)。这只是复制/粘贴错误吗?

    也就是说 - 你确定你找对地方了吗?对我来说,您的to_tsquery('?') 似乎是这里的问题。什么都不返回。

    select to_tsquery('?');
    NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
    
    Successfully run. Total query runtime: 73 msec.
    1 rows affected.
    

    这似乎不是 Clojure 或 JDBC 问题,这只是 postgresql。您能否更详细地描述您的架构以及您想要归档的内容?

    【讨论】:

      【解决方案2】:

      诀窍很明显:只需在 ?指向一个包含您搜索的 ? 的值。

      (require '[honeysql.core :as sql]
      (defn dbr [s] (jdbc/query *db* s))
      (-> {:select [:*] :from [:conversations] :where [:like :full_text "%?%"]} sql/format dbr)
      

      【讨论】:

      • 我并不想在这里刻薄,但我认为您误解了问题所在。添加 honeysql 不会使它成为一个准备好的语句(参数化,是的 - 但你可以在没有 honeysql 的情况下做到这一点)。接受您的地图后吐出的 sql/format 是["SELECT * FROM conversations WHERE (full_text like ?)" "%?%"]。你完全放弃了to_tsquery,这就是整个问题的开始。
      【解决方案3】:

      using the jdbc/execute! function 你可能更幸运,因为它基本上是传递给数据库的原始 SQL 字符串:

      (j/execute! db-spec
         ["update fruit set cost = ( 2 * grade ) where grade > ?" 50.0] )
      

      我会省略参数(至少开始),更像:

      (j/execute! db-spec
         ["update fruit set cost = ( 2 * grade ) where grade > 50.0" ])
      

      除了您的情况,? 可能被解释为参数的占位符。也许需要转义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 2020-02-04
        • 2018-02-13
        • 1970-01-01
        相关资源
        最近更新 更多