Postgres JSON: получить значение первого узла, не зная ключа - PullRequest
0 голосов
/ 25 октября 2018

Я хочу получить значение первого узла, не зная ключа.

{"dog":"198","cat":"2835"}

Я могу вернуть все ключи с 1 в строке, используя json_object_keys(), но я не хочу этого, я хочу толькозначение первого узла в json.

Я хочу вернуть 198

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

demo: db <> fiddle

WITH jsondata AS (
    SELECT '{"dog":"198","cat":"2835"}'::json as data
)
SELECT 
    value
FROM jsondata, json_each_text(data)
LIMIT 1
  1. json_each_text разворачивает все элементы в одну строку с двумя столбцами key и value как типами text (если хотите, вы можете преобразовать этот текст в целое число)
  2. LIMIT вывод в первый


Уведомление :Обычно в объекте JSON нет «первого» элемента.Порядок элементов не является фиксированным.Объект {"a":1, "b":2} равен {"b":2, "a":1}.Так что вполне возможно, что вы получаете любое из обоих значений.Это может быть совершенно случайно.Например, эта скрипка Я не конвертирую в тип json, а в тип jsonb.И это выдает cat.Поэтому от внутренних состояний зависит, какое из них выбрано «первым».
0 голосов
/ 25 октября 2018

Вы можете попробовать использовать row_number оконную функцию для получения первого ключа в CTE, затем используйте -> для получения значения.

CREATE TABLE T(
   col json
);

insert into t values ('{"dog":"198","cat":"2835"}');

Запрос 1 :

with getFirstKey as(
    SELECT keys FROM (
      SELECT keys,row_number() over(order by (select 1)) rn
      FROM (
        SELECT col,json_object_keys(col) keys
        FROM T
      ) t1
    ) t1
    where rn = 1
)

SELECT col::json->(select keys from getFirstKey)
FROM T;

Результаты :

| ?column? |
|----------|
|    "198" |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...