sql - Postgres Json(b) int 数组包含任何数组值

标签 sql json postgresql jsonb

TLDR:如何找到包含 json 数字数组的每条记录,该数组包含给定数组/列表的一个数字。

好的,我尝试了很多,阅读了很多其他线程,但我还没有找到可行的解决方案。我想在 Postgres 中找到一些 JSON 对象。它们包含多项选择的索引。

对象:

[{"id": 5, "list": [1, 2, 3]}, {"id": 6, "list": [4, 5, 6]}]

我需要选择所有包含项目 1 或 5 的对象。现在,我只能检查一个值

SELECT '[1, 2, 3, 4]'::jsonb @> '3'::jsonb as result;

或者如果两者都存在:

SELECT '[1,2,3,4]'::jsonb @> '[1, 2]'::jsonb as result;

或者,有趣的是,如果我有一个字符串数组,我可以做我需要的:

SELECT '["1","2","3","4"]'::jsonb ?| array['1', '5'] as result;

如何将其应用于 JSON 数字数组?我尝试转换为 int[] 和许多其他东西。没有任何效果。我要么需要将数字数组转换为文本数组以使用它,要么为右侧找到正确的转换。这也不起作用:?|数组[1, 5]::文本[]

解决方案一:

好吧,我和 Mao Tsuns 想到的第一件事是使用 OR,看起来仍然是最快和最简单的解决方案。

解决方案 2:

我终于找到了一种更短的方法(就像我认为它应该工作一样)但它是一个类型转换 hell (也是 9.4+)并且看起来不太漂亮:

SELECT array_to_json(translate('[1,2,3,4]'::jsonb::text, '[]', '{}')::text[])::jsonb ?| array['1','5'] 作为结果;

这基本上是将整数转换为字符串。

最佳答案

你可以使用OR:

t=# SELECT '[1, 2, 3, 4]'::jsonb @> '3'::jsonb OR '[1, 2, 3, 4]'::jsonb @> '5'::jsonb as result;
 result
--------
 t
(1 row)

或者将未嵌套的jsonb数组聚合成int数组,比较是否相交:

t=# with c(j) as (values('[1, 2, 3, 4]'::jsonb))
, a as (select j,jsonb_array_elements(j) ja from c)
select array_agg(ja), j, array_agg(ja::text::int) && array[5,4] from a group by j;
 array_agg |      j       | ?column?
-----------+--------------+----------
 {1,2,3,4} | [1, 2, 3, 4] | t
(1 row)

because all jsonb operators behave as documented在你的例子中。而且我没有看到一些优雅的更短的解决方案......

关于sql - Postgres Json(b) int 数组包含任何数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321403/

相关文章:

python - SQLAlchemy 中按特定格式的日期分组

mysql - 拉取一列中编号最小的行

SQL:按月平均

postgresql - 臭名昭著的 java.sql.SQLException : No suitable driver found

php - 加入具有 2 个条件的 2 个表(MySQL 和 PHP)

javascript - 如何获取 javascript 对象的主要属性?

json - 您能否将 Blob 存储中的 JSON 文件的完整内容获取到 ADF 变量中?如果是这样,怎么办?

android - 在 android 中处理动态数据类型

postgresql - 具有 PostgreSQL 引擎连接限制的 RDS 数据库

mysql - 如何优化搜索可为 null 的开始日期或结束日期的 SQL 查询?