在Postgres中获取JSON字段的数据类型

时间:2014-11-03 07:35:24

标签: json postgresql

我有一个Postgres JSON列,其中一些列包含如下数据:

{"value":90}
{"value":99.9}

...而其他列的数据如下:

{"value":"A"}
{"value":"B"}

- >运算符(即fields->'value')会将值转换为JSON,而 - >>运算符(即fields->>'value')将值转换为文本,由pg_typeof报告。有没有办法找到JSON字段的“实际”数据类型?

我目前的做法是使用正则表达式来确定fields :: text中字段 - >>'value'的出现是否用双引号括起来。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

正如@pozs在评论中提到的那样,从9.4版开始,提供了json_typeof(json)jsonb_typeof(jsonb)函数

将最外面的JSON值的类型作为文本字符串返回。可能的类型是对象,数组,字符串,数字,布尔值和null。

https://www.postgresql.org/docs/current/functions-json.html

根据您的情况,说明如何将其用于此问题的示例:

SELECT
    json_data.key,
    jsonb_typeof(json_data.value) AS json_data_type,
    COUNT(*) AS occurrences
FROM tablename, jsonb_each(tablename.columnname) AS json_data
GROUP BY 1, 2
ORDER BY 1, 2;

答案 1 :(得分:0)

我最终在我的环境中访问了PLv8,这很容易:

CREATE FUNCTION value_type(fields JSON) RETURNS TEXT AS $$
    return typeof fields.value;
$$ LANGUAGE plv8;

正如评论中所提到的,9.4中将有一个本机函数。