我有一个 Postgres JSON 列,其中一些列包含如下数据:
{"value":90}
{"value":99.9}
Run Code Online (Sandbox Code Playgroud)
...而其他列的数据如下:
{"value":"A"}
{"value":"B"}
Run Code Online (Sandbox Code Playgroud)
-> 运算符(即 fields->'value')会将值转换为 JSON,而 ->> 运算符(即 fields->>'value')将值转换为文本,如pg_typeof. 有没有办法找到 JSON 字段的“实际”数据类型?
我目前的方法是使用正则表达式来确定 fields::text 中 fields->>'value' 的出现是否被双引号包围。
有没有更好的办法?
OTA*_*TAR 13
正如@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;
Run Code Online (Sandbox Code Playgroud)
我最终在我的环境中访问了 PLv8,这使得这变得很容易:
CREATE FUNCTION value_type(fields JSON) RETURNS TEXT AS $$
return typeof fields.value;
$$ LANGUAGE plv8;
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的,9.4 中将有一个原生函数。
| 归档时间: |
|
| 查看次数: |
2460 次 |
| 最近记录: |