如何迭代结果集并在clojure中提取一个特定值?

时间:2015-05-25 10:27:58

标签: clojure

下面是我尝试迭代结果集并获取其值

(sql/with-connection db 
 (sql/with-query-results rs ["select * from user where UserID=?" 10000] 
    (doseq [rec rs
        s   rec]
  (println (val s))
)))

但是你如何从中提取一个特定的值;我只需要用户名字段。

任何人都可以请证明如何做到这一点吗?

2 个答案:

答案 0 :(得分:3)

结果集是一系列地图,因此如果您想获得一个字段(例如一个名为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将是更有效的选择。当您需要完整的其他内容时,上面的代码非常有用。

答案 1 :(得分:1)

从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实现所有值,它不应该返回一个惰性序列(因此在这个例子中是doall)。