代码之家  ›  专栏  ›  技术社区  ›  Darryl

postgres将json数组转换为列

  •  1
  • Darryl  · 技术社区  · 8 年前

    我在postgres 9.6中工作,仍然在思考json

    我有一个包含json对象的列,它是一个数字数组,表示重复频率和一周中的天数。

    {"every":"1","weekdays":["1"]}
    {"every":"1","weekdays":["1","3"]}
    {"every":"1","weekdays":["1","2","3","4","5"]}
    
    ROW1 -[1]          : MON  
    ROW2 -[1,3]        : MON , WED  
    ROW3 -[1,2,3,4,5]  : MON , TUE , WED , THU , FRI  
    

    我想将这些扩展到列中,以便:

    |ROW- |MON | TUE| WED|THU|FRI|  
    ------------------------------
    |ROW1 |Y   |N   |N   |N  |N  |  
    |ROW2 |Y   |N   |Y   |N  |N  |  
    |ROW3 |Y   |Y   |Y   |Y  |Y  |  
    

    我可以使用 jsonb_array_elements(pattern) 但那又怎样?

    我想使用“contains”表达式来构建每个列

    pattern @> '{1}' ,则, pattern @> '{2}' 等等,但我无法构造出一个能击中目标的物体

    2 回复  |  直到 8 年前
        1
  •  3
  •   klin    8 年前

    示例数据:

    create table my_table(id serial primary key, pattern jsonb);
    insert into my_table (pattern) values
    ('{"weekdays": [1]}'),
    ('{"weekdays": [1, 3]}'),
    ('{"weekdays": [1, 2, 3, 4, 5]}');
    

    您可以使用运算符@>以这种方式:

    select 
        id,
        pattern->'weekdays' @> '[1]' as mon,
        pattern->'weekdays' @> '[2]' as tue,
        pattern->'weekdays' @> '[3]' as wed,
        pattern->'weekdays' @> '[4]' as thu,
        pattern->'weekdays' @> '[5]' as fri
    from my_table
    
     id | mon | tue | wed | thu | fri 
    ----+-----+-----+-----+-----+-----
      1 | t   | f   | f   | f   | f
      2 | t   | f   | t   | f   | f
      3 | t   | t   | t   | t   | t
    (3 rows)    
    
        2
  •  0
  •   Darryl    8 年前

    看起来我使用“contains”的方法是正确的,但我对数组中的内容感到困惑。我应该找字符串而不是数字

    , bookings.pattern->'weekdays' @> '"1"'::jsonb
    

    感谢Pitto提示在问题中加入外部json,这让问题变得显而易见