簡體   English   中英

使用Postgres在HugSQL或YesQL中強制轉換多個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM