我有一个Postgres JSON列,其中一些列包含如下数据:
{"value":90}
{"value":99.9}
...而其他列的数据如下:
{"value":"A"}
{"value":"B"}
- >运算符(即fields->'value')会将值转换为JSON,而 - >>运算符(即fields->>'value')将值转换为文本,由pg_typeof
报告。有没有办法找到JSON字段的“实际”数据类型?
我目前的做法是使用正则表达式来确定fields :: text中字段 - >>'value'的出现是否用双引号括起来。
有更好的方法吗?
答案 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中将有一个本机函数。