PostgreSQL中检查JSON字段是否包含指定值的报错求助
解决PostgreSQL JSON数组包含检查的报错问题
我来帮你搞定这个问题~先看看报错的根源,再给你两种可行的解决方案:
为什么会报错?
你的问题核心是类型不匹配加上数据结构处理错了:
- 你把
filedata转成了text类型,但PostgreSQL的@>包含操作符只能在同类型(比如jsonb和jsonb、数组和数组)之间使用,跨text和jsonb肯定会报错。 - 你的
filedata是一组单独的JSON字符串(看起来像是PostgreSQL的text[]数组),不是一个合法的JSON数组,直接转类型根本没法用@>操作符。
两种正确的实现方式
方法1:逐个检查数组元素(简单直接)
如果filedata是text[]类型,我们可以把数组拆开来,逐个转成jsonb后和目标值比较:
IF EXISTS ( SELECT 1 FROM unnest(filedata) AS single_elem WHERE single_elem::jsonb = '{"fc_primary_key": "A1234567892023/11/22"}'::jsonb ) THEN RAISE NOTICE 'PRIMARY KEY %', 'exists'; END IF;
unnest(filedata)会把你的数组拆成一行一行的单独元素- 每个元素转成
jsonb后,和你要找的JSON对象做等值匹配,只要有一个匹配就会触发通知
方法2:转成合法JSON数组后用包含操作符
如果你想坚持用@>操作符,得先把filedata变成一个合法的JSON数组:
IF (SELECT jsonb_agg(elem::jsonb) FROM unnest(filedata) AS elem) @> '[{"fc_primary_key": "A1234567892023/11/22"}]'::jsonb THEN RAISE NOTICE 'PRIMARY KEY %', 'exists'; END IF;
jsonb_agg(elem::jsonb)会把所有单独的JSON字符串聚合成一个标准的JSON数组- 这时用
@>操作符就能检查目标JSON对象是否存在于数组里了
额外小提示
如果你的filedata本身存储的就是jsonb[]类型(不是text[]),那代码可以更简洁:
IF '{"fc_primary_key": "A1234567892023/11/22"}'::jsonb = ANY(filedata) THEN RAISE NOTICE 'PRIMARY KEY %', 'exists'; END IF;
内容的提问来源于stack exchange,提问作者Sai sri
相关产品推荐
相关产品推荐

