如何将 postgres 中的可变长度记录转换为数组?
How to turn a variable-length record in postgres into an array?
我正在尝试动态创建 table 并将它们的列转换为数组。所以我最终会得到一个只有 1 列的数组类型的 table。数组的长度将等于输入中的列数。如果我事先知道我的(动态创建的)table 有哪些列,解决方案会很简单,但我不知道这一点。
我试过使用数组函数。如果您事先知道 table 包含哪些列,则此方法有效。如果您不知道这一点(因为 table 是动态定义的),您必须使用星号来获取所有列。但是 array 函数然后创建一个只有 1 个元素的数组,包含所有列。这不是我想要的。
CREATE TEMPORARY TABLE my_addresses(
personname TEXT NOT NULL,
streetname TEXT NOT NULL,
country_id TEXT
);
------------------------------------------------------------------------
INSERT INTO my_addresses
VALUES( 'Bill Gates', 'Somewhere Avenue', 'US'),
('Linus Thorvalds', 'Other Road', 'US'),
('Erwin Brandstetter', 'Solution Street', 'AT'); --it's a tribute :-)
------------------------------------------------------------------------
SELECT
cardinality(ARRAY[ ma.personname,
ma.streetname,
ma.country_id]), --an array of 3 elements is created, as you would expect
cardinality(ARRAY[ma.*]) --an array of 1 element is created, which is not what I want
FROM my_addresses AS ma;
顺便说一句,这是我在 Whosebug 上的第一个 post(请原谅我的任何格式错误)。我使用 Postgres 版本 9.6.14.
这看起来很奇怪。但是对于涉及整个记录的许多挑战,解决方案通常是使用 JSON
。在这种情况下:
SELECT (SELECT array_agg(t.v)
FROM jsonb_each_text(to_jsonb(ma.*)) t(k, v)
) as myarray
FROM my_addresses ma;
Here 是一个 db<>fiddle.
您可能会发现 JSON 是解决您最终问题的更好方法。但是这个问题特别询问数组。
我正在尝试动态创建 table 并将它们的列转换为数组。所以我最终会得到一个只有 1 列的数组类型的 table。数组的长度将等于输入中的列数。如果我事先知道我的(动态创建的)table 有哪些列,解决方案会很简单,但我不知道这一点。
我试过使用数组函数。如果您事先知道 table 包含哪些列,则此方法有效。如果您不知道这一点(因为 table 是动态定义的),您必须使用星号来获取所有列。但是 array 函数然后创建一个只有 1 个元素的数组,包含所有列。这不是我想要的。
CREATE TEMPORARY TABLE my_addresses(
personname TEXT NOT NULL,
streetname TEXT NOT NULL,
country_id TEXT
);
------------------------------------------------------------------------
INSERT INTO my_addresses
VALUES( 'Bill Gates', 'Somewhere Avenue', 'US'),
('Linus Thorvalds', 'Other Road', 'US'),
('Erwin Brandstetter', 'Solution Street', 'AT'); --it's a tribute :-)
------------------------------------------------------------------------
SELECT
cardinality(ARRAY[ ma.personname,
ma.streetname,
ma.country_id]), --an array of 3 elements is created, as you would expect
cardinality(ARRAY[ma.*]) --an array of 1 element is created, which is not what I want
FROM my_addresses AS ma;
顺便说一句,这是我在 Whosebug 上的第一个 post(请原谅我的任何格式错误)。我使用 Postgres 版本 9.6.14.
这看起来很奇怪。但是对于涉及整个记录的许多挑战,解决方案通常是使用 JSON
。在这种情况下:
SELECT (SELECT array_agg(t.v)
FROM jsonb_each_text(to_jsonb(ma.*)) t(k, v)
) as myarray
FROM my_addresses ma;
Here 是一个 db<>fiddle.
您可能会发现 JSON 是解决您最终问题的更好方法。但是这个问题特别询问数组。