在Postgres中填充JSON中的记录

时间:2015-02-19 19:12:40

标签: arrays json postgresql

我的数据库中有一个列,其中包含一个存储为text的数组:

ID | My_data
 0 | [[A, 0.1], [B, 0.1]]
 1 | [[A, 3.2], [B, 1.1]]
 : |  :
99 | [[B, 0.2], [A, 4.4]]

请注意,数组中的数据并不总是以相同的顺序存储。

我有兴趣转换数组中的记录,使它们成为数据库中的列:

ID |   A |   B
 0 | 0.1 | 0.1
 1 | 3.2 | 1.1
 : |   : |   :
99 | 4.4 | 0.2

我的理解是,如果我的数组是json格式,如json_populate_record,但我的数据不是这种格式,则可以使用{'a':0.1, 'b':0.1}

有没有人知道进行这种数据转换的方法?

1 个答案:

答案 0 :(得分:0)

我开发了一些解决方案,也许会引起你的兴趣:

-- #1st part
CREATE TYPE custom_record AS (id INT, A TEXT, B TEXT);

-- #2nd part
CREATE OR REPLACE FUNCTION show_records()
  RETURNS SETOF custom_record AS
  $$
  DECLARE
    single_record RECORD;
    return_record custom_record%ROWTYPE;
    matches       TEXT [];
    single_match  TEXT;
    tmp           TEXT [];
    A             TEXT;
    B             TEXT;
  BEGIN
    FOR single_record IN SELECT *
                         FROM test LOOP
      A = NULL;
      B = NULL;
      matches = regexp_matches(single_record.my_data, '\[\[(.+)\], \[(.+?)\]\]');

      FOREACH single_match IN ARRAY matches LOOP
        tmp = string_to_array(single_match, ', ');
        IF tmp [1] = 'A'
        THEN
          A = tmp [2];
        ELSE
          B = tmp [2];
        END IF;
      END LOOP;
      return_record.id = single_record.id;
      return_record.A = A;
      return_record.B = B;
      RETURN NEXT return_record;
    END LOOP;
  END;
  $$ LANGUAGE plpgsql;

-- #3rd part
SELECT * FROM show_records()

说明:

#1st part

创建将由函数返回的新类型。

#2nd part

主要功能,将记录翻译成新结构,有关详细信息,请转到docs。

#3rd part

选择已翻译的行。


输出:

tests=> select * from show_records();
 id |  a  |  b  
----+-----+-----
  1 | 0.1 | 0.1
  2 | 3.2 | 1.1
  3 | 4.4 | 0.2
(3 rows)