如何迭代结果集并在 clojure 中提取一个特定值?
How to iterate over a result set and extract one particular value in clojure?
下面是我尝试迭代结果集并获取其值的尝试
(sql/with-connection db
(sql/with-query-results rs ["select * from user where UserID=?" 10000]
(doseq [rec rs
s rec]
(println (val s))
)))
但是你如何从中提取一个特定的值;我只需要用户名字段。
任何人都可以演示如何执行此操作吗?
结果集是一系列映射,因此如果您想获得一个字段(例如一个名为 name
的字段),则:
(sql/with-connection db
(sql/with-query-results rs ["select * from user where UserID=?" 10000]
(doseq [rec rs]
(let [name (:name rec)]
(println "User name:" name)
(println "Full record (including name):" rec)))))
但是正如评论中提到的,如果您只想要名称,那么 select name from
将是更有效的选择。当您需要整行用于其他内容时,上面的代码很有用。
从 clojure.java.jdbc 3.0 开始,with-connection
/ with-query-results
语法是 deprecated。使用新的 query
语法和额外的 :row-fn
和 :result-set-fn
参数可以更轻松地完成过滤结果。
(query db ["select * from user"]
:row-fn :name
:result-set-fn #(doall (take 1000 (drop 10000 %))))
一定要让 result-set-fn 实现所有值,它不应该 return 惰性序列(因此本例中的 doall
)。
下面是我尝试迭代结果集并获取其值的尝试
(sql/with-connection db
(sql/with-query-results rs ["select * from user where UserID=?" 10000]
(doseq [rec rs
s rec]
(println (val s))
)))
但是你如何从中提取一个特定的值;我只需要用户名字段。
任何人都可以演示如何执行此操作吗?
结果集是一系列映射,因此如果您想获得一个字段(例如一个名为 name
的字段),则:
(sql/with-connection db
(sql/with-query-results rs ["select * from user where UserID=?" 10000]
(doseq [rec rs]
(let [name (:name rec)]
(println "User name:" name)
(println "Full record (including name):" rec)))))
但是正如评论中提到的,如果您只想要名称,那么 select name from
将是更有效的选择。当您需要整行用于其他内容时,上面的代码很有用。
从 clojure.java.jdbc 3.0 开始,with-connection
/ with-query-results
语法是 deprecated。使用新的 query
语法和额外的 :row-fn
和 :result-set-fn
参数可以更轻松地完成过滤结果。
(query db ["select * from user"]
:row-fn :name
:result-set-fn #(doall (take 1000 (drop 10000 %))))
一定要让 result-set-fn 实现所有值,它不应该 return 惰性序列(因此本例中的 doall
)。