![](/img/trans.png)
[英]How to insert and update postgres arrays using yesql in clojure?
[英]Casting Multiple Values in HugSQL or YesQL with Postgres
我正在嘗試將IP地址列表轉換為::inet
但是僅轉換列表中的最后一個元素。
我嘗試了以下方法,但似乎無濟於事。
select * from ip_addresses where address in (:addresses::inet)
select * from ip_addresses where address in (:addresses)::inet
select * from ip_addresses where address in CAST (:addresses AS inet)
我不能簡單地轉換address::text
因為如果輸入地址沒有指定子網,匹配可能會失敗。
聽起來好像HugSQL用逗號分隔的列表替換了:addresses
,所以您的(:addresses::inet)
最終看起來像(addr, addr, addr, ..., addr::inet)
。 如果是這種情況,那么您可以用= any(array)
替換in (list)
,使用數組構造函數語法 ,然后對整個數組進行強制轉換:
select * from ip_addresses where address = any(array[:addresses]::inet[])
我認為@ mu-is-too-short的答案是更好的解決方法-使用Postgresql的功能解決問題。
即使這樣,如果您不想為此使用Postgresql數組,也可以使用Clojure表達式為HugSQL中的向量中的每個值生成一個強制類型轉換:
-- :name x
-- :require [clojure.string :as string]
select * from test where id in (
/*~
(clojure.string/join
","
(map-indexed (fn [i v] (str ":values." i "::int")) (:values params)))
~*/
)
最終會給你這樣的東西:
(x-sqlvec {:values ["1" "2"]})
;=> ["select * from test where id in (?::int,?::int)" "1" "2"]
因此,以上代碼采用了值向量,並使用HugSQL的deep-get語法分別提取每個值,並將類型轉換添加到每個值。 因此,您正在有效地動態構建一組新的HugSQL參數,如下所示:
in (:values.0::int, :values.1::int, :values.2::int)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.