代码之家  ›  专栏  ›  技术社区  ›  Mateusz Urbański

从PostgreSQL中的jsonb数组中获取一个元素

  •  0
  • Mateusz Urbański  · 技术社区  · 7 年前

    我的PostgreSQL数据库中有以下架构:

    CREATE TABLE survey_results (
        id integer NOT NULL
    );
    
    CREATE TABLE slide_results (
        id integer NOT NULL,
        survey_result_id integer,
        buttons jsonb DEFAULT '[]'::jsonb
    );
    
    INSERT INTO survey_results (id)
      VALUES (1);
    
    INSERT INTO slide_results (id, survey_result_id, buttons)
      VALUES (1, 1, '[{"text": "Not at all"}, {"text": "Yes"}]');
    
    INSERT INTO slide_results (id, survey_result_id, buttons)
      VALUES (2, 1, '[{"text": "No"}, {"text": "Yes"}]');
    

    WITH data AS ( 
      select 
        sr.id ,
        jsonb_agg(row_to_json(slr)) AS json_row
      from slide_results slr
      INNER JOIN survey_results sr ON sr.id = slr.survey_result_id
      group by sr.id
    )
    
    SELECT id, json_row->0->>'buttons' from data;
    

    返回:

    | id  | ?column?                                  |
    | --- | ----------------------------------------- |
    | 1   | [{"text": "Not at all"}, {"text": "Yes"}] |
    

    我希望此查询只返回buttons数组的第一个元素。我试过这样的方法:

    WITH data AS ( 
      select 
        sr.id ,
        jsonb_agg(row_to_json(slr)) AS json_row
      from slide_results slr
      INNER JOIN survey_results sr ON sr.id = slr.survey_result_id
      group by sr.id
    )
    
    SELECT id, json_row->0->>'buttons'->>1 from data;
    

    Query Error: error: operator does not exist: text ->> integer
    

    我怎样才能解决这个问题?

    https://www.db-fiddle.com/f/gP761psywgmovfdTT7DjP4/1

    1 回复  |  直到 7 年前
        1
  •  21
  •   NotAnAuthor    7 年前
    SELECT id, json_row->0->'buttons'->>0 from data;
    

    你指的是 'buttons'

    此外,数组的索引基于0,因此指向 1 将产生第二个元素。