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

获取Postgres中JSON字段的数据类型,json,postgresql,Json,Postgresql,我有一个Postgres JSON列,其中一些列包含以下数据: {"value":90} {"value":99.9} {"value":"A"} {"value":"B"} …而其他列具有以下数据: {"value":90} {"value":99.9} {"value":"A"} {"value":"B"} ->运算符(即字段->'value')将值转换为JSON,而->>运算符(即字段->>'value')将值转换为文本,如pg\u typeof所述。有没有办法找到JSON字段的“

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

{"value":90}
{"value":99.9}
{"value":"A"}
{"value":"B"}
…而其他列具有以下数据:

{"value":90}
{"value":99.9}
{"value":"A"}
{"value":"B"}
->运算符(即字段->'value')将值转换为JSON,而->>运算符(即字段->>'value')将值转换为文本,如
pg\u typeof
所述。有没有办法找到JSON字段的“实际”数据类型

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


有更好的方法吗?

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

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

如注释中所述,9.4中会有一个本机函数用于此功能。

如注释中提到的@pozs,从9.4版开始,有可用的
json_-typeof(json)
jsonb_-typeof(jsonb)
函数

以文本字符串形式返回最外层JSON值的类型。可能的类型有object、array、string、number、boolean和null

在您的案例中,举例说明如何将其用于解决此问题:

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;

好问题。请在pgsql general上提出讨论;json/jsonb特性开发人员挂在那里,而不是这里。我们可以使用
json[b]\u value\u kind
函数或类似的东西。您也可以尝试转换这些值,如下面所述:好的,Houari。在我的上下文中,问题是“5”可能意味着与5不同的东西。但是你的建议对大多数可能遇到这种情况的人来说仍然有效。实际上,在PostgreSQL 9.4+中会有一个函数用于此功能:
json[b]\u typeof(json[b])
——在此之前,你可以检查json表示的第一个非空白字符(不需要健壮的正则表达式)