如何获取PostgreSQL中jsonb列各值的数据类型?
获取PostgreSQL jsonb列值的实际数据类型
你用->>操作符返回全text类型是正常的——这个操作符的核心作用就是把jsonb字段里的值统一转成文本格式输出。要获取每个值的实际数据类型,或是保留原类型取出数据,可按以下方法处理:
1. 查看指定键值的实际数据类型
用PostgreSQL内置的jsonb_typeof函数,它会返回jsonb值的原生类型(比如string、number、boolean、null等)。针对你的数据集,查询uuid和size的类型可以这么写:
select id, data, jsonb_typeof(data -> 'uuid') as uuid_type, jsonb_typeof(data -> 'size') as size_type from "postgres"."public"."_airbyte_stream" where data ->> 'form_id' = 'base';
这里data -> 'uuid'返回的是jsonb类型的原始值,再套一层jsonb_typeof就能拿到它的实际类型。
2. 保留原类型取出字段值
如果不想转成text,而是保留jsonb的原生类型(比如数字就是numeric类型),直接用->操作符代替->>即可,它会返回jsonb类型的值。如果需要转成对应SQL类型,可直接加类型转换:
select ab_id, data, -- 保留jsonb原生类型 data -> 'no_of_meals_per_day' as no_of_meals_per_day_jsonb, -- 转换为SQL整数类型(需确保值本身是数字,否则会报错) (data -> 'no_of_meals_per_day')::int as no_of_meals_per_day_int from "postgres"."public"."_airbyte_stream" where data ->> 'form_id' = 'base';
注意:转换SQL类型前,最好先用jsonb_typeof确认值的类型,避免类型不匹配报错。
3. 遍历jsonb对象所有键值对及类型
如果需要一次性拿到jsonb对象里所有键的名称和对应值的类型,用jsonb_each函数拆分对象:
select id, jsonb_key as key_name, jsonb_typeof(jsonb_value) as value_type, jsonb_value as original_value from "postgres"."public"."_airbyte_stream", jsonb_each(data) where data ->> 'form_id' = 'base';
这个查询会把每个jsonb对象拆成多行,每行对应一个键值对的名称、类型和原始值。
内容的提问来源于stack exchange,提问作者Siddhant Singh
相关产品推荐
相关产品推荐

