如何在Clojure中为PostgreSQL查询的username字段应用LOWER()函数?
实现方式
以下是两种基于你的代码库,为:username应用PostgreSQL LOWER()函数的可行方案:
方案一:数据库端对字段和输入值都应用LOWER函数
直接在Honey SQL的WHERE条件中,同时对表字段和传入参数使用LOWER()函数,确保匹配时不区分大小写:
(defn get-by-username [db username] (let [query (honey/format {:select [:*] :from [:user] :where [:= [:lower :username] [:lower username]]})] (jdbc/query db query)))
Honey SQL会生成如下SQL语句:
SELECT * FROM "user" WHERE LOWER("username") = LOWER(?)
这种方式最健壮,无论传入的username是否为小写,数据库都会统一转换后比较,避免因应用层处理遗漏导致的匹配失败。
方案二:应用层转小写,数据库仅处理字段
先在Clojure代码中将输入的username转为小写,再让数据库对表字段应用LOWER()函数:
(require '[clojure.string :as str]) (defn get-by-username [db username] (let [lower-username (str/lower-case username) query (honey/format {:select [:*] :from [:user] :where [:= [:lower :username] lower-username]})] (jdbc/query db query)))
生成的SQL语句为:
SELECT * FROM "user" WHERE LOWER("username") = ?
这种方式减少了一次数据库端的函数调用,适合能确保应用层输入转换逻辑可靠的场景。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

