我想运行一个sql查询,给定一个搜索关键字,将找到所有用户,他们的名字与该模式匹配。即在原始 SQL 中,类似于 WHERE users.name LIKE "%foo%"
我该怎么做呢?
当前查询结构 ->
(defn find-users [db, search]
(->> (d/q '[:find ?u :where
[?u :user/uuid ?id]
[?u :user/name ..]
db)
(map first)))
最佳答案
我用的就是这个。也许您可以根据您的需要进行调整。
(defn find-items "Full text search titles and descriptions for [search-term]" [search-term]
(let [keyys [:item-id :title :description]
rules '[[(finditem ?item ?term) [(fulltext $ :item/title ?term) [[?item ?name]]]]
[(finditem ?item ?term) [(fulltext $ :item/description ?term) [[?item ?name]]]]]
items (d/q '[:find ?item ?title ?description
:in $ ?term %
:where
(finditem ?item ?term)
[?item :item/title ?title]
[?item :item/description ?description]]
(d/db db/CONN)
search-term rules)]
(map #(zipmap keyys %) items)))
这使用规则,您可以在此处阅读:http://docs.datomic.com/query.html 。规则相当于一个很好的 SQL OR
等效项,这就是我在上面的示例中大海捞针的方式。
关于datomic - Datomic 中的 SQL LIKE 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745383/