【问题标题】:How to compose a Clojure Query with embedded double quotes如何编写带有嵌入双引号的 Clojure 查询
【发布时间】:2014-10-12 13:47:20
【问题描述】:

我想编写一个 Clojure 查询,以便将 where 子句中的 lnamfnam 参数用双引号引起来。我需要双引号,因为嵌入的名称包含单引号字符,例如“O'BRIEN”。

我一直在查看 Clojure 查询和在字符串中嵌入双引号的示例,但没有找到我想要的示例。

这在lein repl 中运行良好

gic-cmp.core=> (def lnam "O'BRIEN")
#'gic-cmp.core/lnam
gic-cmp.core=> (str """"lnam"""")
"O'BRIEN"

但这不会在下面的查询中产生带引号的字符串。

(defn match-this-rec-with-last
    ""
    [gic-id lnam fnam search-date]
    (let [query (str (str "select g.* from gic_employees g where g.processed_date = '" search-date "' ")
                          (str "and g.gic_id = '" gic-id "' and g.last_name = ")
                          """"lnam""""
                          (str " and g.first_name = ")
                          (str """"fnam"""")
                          (str " order by g.processed_date desc "))]
      (println query)
      (j/query db
            [query])))

【问题讨论】:

    标签: mysql string jdbc clojure


    【解决方案1】:

    REPL 显示带有引号的 str 函数的返回值。

    (str """"lnam"""")
    

    这将返回 2 个空字符串、lnam 和另外 2 个空字符串,它们都带有引号。

    底层字符串是 java.lang.String,在字符串中包含双引号的标准 java 方法是使用反斜杠对其进行转义。

    user=> (str "test with \"quoted\" value")
    "test with \"quoted\" value"
    user=> (println (str "test with \"quoted\" value"))
    test with "quoted" value
    

    【讨论】:

      【解决方案2】:

      使用 ?对于查询参数,jdbc 将正确地转义它们:

      (defn match-this-rec-with-last
        ""
        [gic-id lnam fnam search-date]
        (let [query [(clojure.string/join " " ["select g.* from gic_employees g where g.processed_date = ?"
                                                "AND g.gic_id = ? and g.last_name = ?"
                                                "AND g.first_name = ?"
                                                "ORDER BY g.processed_date desc"])
                     ;; values
                     search-date gic-id lnam fnam]]
          (println query)
          (j/query db
                   query)))
      

      【讨论】:

      猜你喜欢
      • 2019-02-15
      • 2019-09-08
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多