如何从逗号分隔UUID字符串构建SQL WHERE查询?SQLKorma实现遇阻
解决SQLKorma中生成多UUID OR条件的WHERE子句问题
你想要实现的是接收逗号分隔的UUID字符串,拆分后生成包含多个OR条件(或等价的IN条件)的SQL查询,而当前的SQLKorma代码没能正确生成WHERE子句,问题出在你处理条件的方式上。
首先,先明确你期望生成的目标SQL(修正了原SQL里的语法问题,每个UUID都需要加引号):
SELECT * FROM my-table WHERE uuid="4506ef72-aa17-452b-9456-38d11c71897b" OR uuid="bd46629d-0e8c-4d70-874a-76bfade8ef14" OR uuid="b0c11580-7cde-4a4e-ba0a-30f9de52e3b5" ORDER BY created DESC
原代码的问题分析
你写的fetch函数里,用for循环去逐个调用korma/where,这会返回一个查询对象的序列,而不是把所有条件合并到同一个查询实例里。SQLKorma的查询构建是链式的,每次调用where都会返回一个新的查询对象,但for循环会生成多个独立的查询,最终query-only无法正确处理这个序列,导致WHERE子句生成失败。
正确的实现方式
方式一:用IN条件(更高效推荐)
多个OR uuid=?的条件等价于uuid IN (...),这种写法更简洁,数据库优化器也更容易处理:
(defn fetch [uuid-str] (-> (korma/select* :my-table) (korma/order :created :DESC) ;; 当uuid-str不为空时,添加IN条件 (cond-> uuid-str (korma/where {:uuid [in (str/split uuid-str #",")]})) (korma/query-only)))
这个版本会生成类似这样的SQL:
SELECT * FROM my-table WHERE uuid IN ('4506ef72-aa17-452b-9456-38d11c71897b', 'bd46629d-0e8c-4d70-874a-76bfade8ef14') ORDER BY created DESC
方式二:显式生成OR条件
如果确实需要生成多个OR子句(比如有特殊需求),可以用korma/or来合并条件:
(defn fetch [uuid-str] (-> (korma/select* :my-table) (korma/order :created :DESC) (cond-> uuid-str ;; 把拆分后的UUID转换成{:uuid id}的集合,再用korma/or合并 (korma/where (apply korma/or (map #(hash-map :uuid %) (str/split uuid-str #","))))) (korma/query-only)))
这个版本会生成你最初期望的多个OR条件的SQL语句。
内容的提问来源于stack exchange,提问作者Freid001
相关产品推荐
相关产品推荐

