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

Dev*_*rty 8 postgresql json

我有一个 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)


Dev*_*rty 0

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

CREATE FUNCTION value_type(fields JSON) RETURNS TEXT AS $$
    return typeof fields.value;
$$ LANGUAGE plv8;
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,9.4 中将有一个原生函数。