我的数据库中有一个列,其中包含一个存储为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}
。
有没有人知道进行这种数据转换的方法?
答案 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)