PostgreSQL:row_to_json,带有选择列

时间:2016-10-14 11:46:52

标签: json postgresql row postgresql-9.4

任务概念和我的问题

使用Postgres 9.4。如何将row_to_json(row)与选择列(而不是整行)一起使用?我需要在构建JSON时从行构造函数中丢弃一列,但还需要保留列名。

限制

  1. 不要使用自选联接到同一个表/ cte并使用选择性列选择
  2. 之后不要使用外部功能来处理从json删除密钥
  3. 我很清楚我可以编写并使用自己的函数从JSON中删除密钥,或者在Postgres 9.5中有JSONB的-运算符。但是,如果没有额外的函数调用,我希望事先这样做,我很确定它是可能的。

    MVCE和解释

    生成样本数据

    CREATE TABLE test_table ( id int, col1 int, col2 int, col3 text );
    INSERT INTO test_table VALUES 
      (1, 23, 15, 'Jessica'), (2, 43, 84, 'Thomas');
    

    1)首先尝试简单的row_to_json(row),这显然不起作用:

    SELECT id, row_to_json(t) FROM test_table t
    

    我需要从行构造函数中丢弃列id,而不是在将行解析为json时添加它。以上回报:

     id |                  row_to_json
    ----+-----------------------------------------------
      1 | {"id":1,"col1":23,"col2":15,"col3":"Jessica"}
      2 | {"id":2,"col1":43,"col2":84,"col3":"Thomas"}
    

    2)第二次尝试,明确传递列row_to_json(row(col1, ...))

    SELECT id, row_to_json(row(col1, col2, col3)) FROM test_table t
    

    但是我失去了列名称(正如文档中提到的那样,它都会转换为fX,其中X是一个数字:

     id |           row_to_json
    ----+----------------------------------
      1 | {"f1":23,"f2":15,"f3":"Jessica"}
      2 | {"f1":43,"f2":84,"f3":"Thomas"}
    

    预期输出

    预期输出显然来自MVCE中的(1)点,但没有id键值对:

     id |                  row_to_json
    ----+-----------------------------------------------
      1 | {"col1":23,"col2":15,"col3":"Jessica"}
      2 | {"col1":43,"col2":84,"col3":"Thomas"}
    

1 个答案:

答案 0 :(得分:1)

似乎创建一个具有所需列名和匹配数据类型的类型然后将行转换为它将会起到作用:

CREATE TYPE my_type AS (
  col1 int,
  col2 int,
  col3 text
);

然后通过将行的强制转换添加到已定义的类型来改变我的语句:

SELECT id, row_to_json(cast(row(col1, col2, col3) as my_type)) FROM test_table t;

列出预期的输出:

 id |                  row_to_json
----+-----------------------------------------------
  1 | {"col1":23,"col2":15,"col3":"Jessica"}
  2 | {"col1":43,"col2":84,"col3":"Thomas"}

但是,是否有任何方法可以在没有其他类型的情况下构建它?