EDIT:
Как pozs указывает, есть две typeof
функции: один для JSON и один для SQL. Этот запрос является тот, который вы ищете:
SELECT
json_data.key,
jsonb_typeof(json_data.value),
count(*)
FROM x, jsonb_each(x.data) AS json_data
group by key, jsonb_typeof
order by key, jsonb_typeof;
Старый Ответ: (Эй, это работает ...)
Этот запрос возвращает тип ключей:
SELECT
json_data.key,
pg_typeof(json_data.value),
json_data.value
FROM x, jsonb_each(x.data) AS json_data;
... К сожалению, вы заметите, что Postgres не различает разные типы JSON. он рассматривает все это как jsonb
, так что результаты:
key1 | value1 | value
------+--------+-----------
a | jsonb | "test"
b | jsonb | 123
c | jsonb | null
d | jsonb | true
a | jsonb | "test"
b | jsonb | 123
c | jsonb | null
d | jsonb | "yay"
e | jsonb | "foo"
f | jsonb | [1, 2, 3]
(10 rows)
Тем не менее, не так много JSON primitive types, и выход, кажется однозначным. Так что этот запрос будет делать то, что Вы желаете:
with jsontypes as (
SELECT
json_data.key AS key1,
CASE WHEN left(json_data.value::text,1) = '"' THEN 'String'
WHEN json_data.value::text ~ '^-?\d' THEN
CASE WHEN json_data.value::text ~ '\.' THEN 'Number'
ELSE 'Integer'
END
WHEN left(json_data.value::text,1) = '[' THEN 'Array'
WHEN left(json_data.value::text,1) = '{' THEN 'Object'
WHEN json_data.value::text in ('true', 'false') THEN 'Boolean'
WHEN json_data.value::text = 'null' THEN 'Null'
ELSE 'Beats Me'
END as jsontype
FROM x, jsonb_each(x.data) AS json_data -- Note that it won't work if we use jsonb_each_text here because the strings won't have quotes around them, etc.
)
select *, count(*) from jsontypes
group by key1, jsontype
order by key1, jsontype;
Выход:
key1 | jsontype | count
------+----------+-------
a | String | 2
b | Integer | 2
c | Null | 2
d | Boolean | 1
d | String | 1
e | String | 1
f | Array | 1
(7 rows)
Ваш 'оператор INSERT' не отформатирована совсем верно. – Travis
Функция ['json [b] _typeof (json [b])'] (http://www.postgresql.org/docs/current/static/functions-json.html) дает точно, что вам нужно (требуется PostreSQL 9.4+). Но я не уверен, как вы хотите объединить свои результаты, f.ex. как вы хотите представить 'd | boolean: 1 строка: 1' строка? – pozs
Это решение. Как только я нашел одну функцию 'typeof', я не думал искать вторую. – Travis