postgresql - 使用 Postgres 在 HugSQL 或 YesQL 中转换多个值
问题描述
我正在尝试将 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
如果输入地址没有指定子网,我不能简单地转换,因为匹配可能会失败。
解决方案
我认为@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)
推荐阅读
- java - Spring使用错误的application.yaml
- c# - 如何将自动映射器与条件语句一起使用
- javascript - 如果路径的最后一部分是变量,如何使我的网页的 URL 工作?
- python - 为什么在 Selenium 中等待元素加载后元素没有出现?
- c# - 使用 GPU 绘制网格
- python - 通过多个条件选择行的惰性方式
- python - 如何使用 AWS_IAM 授权从 lambda 函数访问 Appsync API
- php - 注意:试图获取非对象的属性“项目”
- node.js - 如何在查询中将 $1 添加到 json 路径中?
- r - 如何将多个ggarrange图保存到R中的单个pdf