PostgreSQL中提取JSONB对象动态键及对应内容的方法咨询
PostgreSQL中提取JSONB对象动态键及对应内容的方法咨询
嗨,我完全懂你的困扰——这个orgs下面的是JSON对象而非数组,所以用数组下标->0或者路径#>'{orgs, 0}'肯定会报错。咱们可以用PostgreSQL专门为JSON对象键值对设计的函数来解决这个问题,具体操作如下:
假设你的表名为your_table,存储这个JSONB数据的字段名为data,你可以这么写查询语句:
SELECT org_key AS org_id, org_value->>'leg' AS leg, (org_value->>'oid')::bigint AS oid, org_value->>'eTag' AS e_tag, org_value->>'ogrn' AS ogrn, org_value->>'type' AS type, org_value->>'fullName' AS full_name, org_value->>'shortName' AS short_name, (org_value->>'isLiquidated')::boolean AS is_liquidated FROM your_table, jsonb_each(data->'orgs') AS org_data(org_key, org_value);
我来给你拆解下这个逻辑:
jsonb_each(data->'orgs')会把orgs这个JSON对象拆分成键值对的行数据,我们给拆分出来的键和值分别起别名org_key和org_value,这样你就能直接把780162681473这个动态键作为org_id字段拿到手。- 之后针对
org_value,你就可以用->>操作符提取里面的各个属性,还能根据需要把字段转成对应的数据类型(比如把oid转成bigint,isLiquidated转成boolean)。
如果只是想先单独提取出那个动态的键值,也可以用这个更简单的语句:
SELECT jsonb_object_keys(data->'orgs') AS org_id FROM your_table;
jsonb_object_keys会直接返回orgs下所有的顶级键,刚好能拿到你要的780162681473。
要是你的orgs下面有多个动态键(比如多个组织数据),上面的第一个查询会自动把每个键都拆成单独的行,完全不用修改代码就能适配,非常灵活。
内容来源于stack exchange
相关产品推荐
相关产品推荐

