Postgres JSON:在不知道键的情况下获取第一个节点值

时间:2018-10-25 09:35:51

标签: sql json postgresql

我想在不知道键的情况下获取第一个节点值。

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

我可以使用json_object_keys()以每行1个的键返回所有键,但是我不想要这个,我只想要json中的第一个节点值。

我想退回198

我该怎么做?

2 个答案:

答案 0 :(得分:1)

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将所有元素扩展为一行,每列分别具有两列keyvalue,类型为text(如果您愿意,可以将此文本转换为整数)< / li>
  2. LIMIT输出到第一个


通知:通常,JSON对象中没有“ first”元素。元素的顺序不固定。对象{"a":1, "b":2}等于{"b":2, "a":1}。因此,您可能会同时获得这两个值。它可能是完全随机的。例如。在this fiddle中,我不是转换为json类型,而是输入jsonb。这给出了cat。因此,取决于内部状态中哪个被选为“第一个”。

答案 1 :(得分:0)

您可以尝试使用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;

Results

| ?column? |
|----------|
|    "198" |