Sql JSON字段检查查询中存在
我正在数据库中使用PostgreSQL JSON类型字段 JSON格式:Sql JSON字段检查查询中存在,sql,arrays,json,postgresql,exists,Sql,Arrays,Json,Postgresql,Exists,我正在数据库中使用PostgreSQL JSON类型字段 JSON格式: [ {"id": "13", "something": "not_important"}, {"id": "5426565165191919", "something": "not_important"}, {"id": "46", "something": "not_important"} ... ] ID列表,如[“13”、“46”、“84”] 如何进行查询,告诉我某个ID不存在?(哪一个不重
[
{"id": "13", "something": "not_important"},
{"id": "5426565165191919", "something": "not_important"},
{"id": "46", "something": "not_important"}
...
]
ID列表,如[“13”、“46”、“84”]
如何进行查询,告诉我某个ID不存在?(哪一个不重要。)
- CTE(
query)只是替换实际的表WITH
t
- 使用
识别缺少的值。细节:LEFT JOIN/NOT NULL
- 假设
足够宽,可以容纳bigint
值。否则,请切换到id
数值
select
expected.id
from
(select substring(value::varchar from 2 for char_length(value::varchar)-2)::bigint id from json_array_elements('["13","46","84"]'::json)) expected
left join (select (value->>'id')::bigint id from json_array_elements('[{"id":"13"},{"id":"5426565165191919"},{"id":"46"}]'::json)) actual on actual.id=expected.id
where
actual.id is null
;
在上面的查询中,我调用json\u array\u elements()
从每个json字符串中提取单个数组元素。因为目标JSON字符串有对象数组元素,所以我们必须进一步提取“id”
值,这可以通过->
操作符完成。请注意,value
似乎是json\u array\u elements()
函数为单列输出指定的默认名称
一个怪癖是,提取的JSON(即值
值)仍然是JSON
类型,而且似乎无法将JSON
文本直接转换为整型值,例如int
或bigint
,即使整个JSON
文本仅由有效的int
/bigint
组成,但您可以通过varchar
到达:
select '34'::json::bigint; -- "ERROR: cannot cast type json to bigint"
select '34'::json::varchar::bigint; -- works, 34
这就是为什么我必须用::varchar::bigint
强制转换json
值
此外,我还必须使用substring()
,从双引号字符串中提取预期的ID,否则::bigint
强制转换将无法工作
还有一点,我使用了bigint
而不是int
,因为这里有一个相当大的数字(54265651651919)
如果只想选择一个布尔值,指示是否至少缺少一个预期id,可以将select子句更改为:
select
case when count(expected.id)>0 then true else false end some_missing
您可以通过使用(返回
文本
)而不是->
,来避免额外的强制转换。啊,这一点很好。有没有办法避免在预期的ids子查询中进行额外的强制转换?这里没有解引用,它只是value::varchar
,因此不能使用->
。您可以使用json\u array\u elements()
的另一个实例,只要将输入作为json数组提供即可。我在回答中使用了一个普通数组(bigint[]
)和相应的unnest()
),它很有效!谢谢你。
select
case when count(expected.id)>0 then true else false end some_missing