【问题标题】:How to turn a variable-length record in postgres into an array?如何将postgres中的可变长度记录转换为数组?
【发布时间】:2019-08-26 16:33:09
【问题描述】:

我正在尝试动态创建表并将它们的列转换为数组。所以我最终会得到一个只有 1 列的数组类型的表。数组的长度将等于输入中的列数。如果我事先知道我的(动态创建的)表有哪些列,解决方案会很简单,但我不知道。

我尝试过使用数组函数。如果您事先知道表包含哪些列,则此方法有效。如果您不知道这一点(因为表是动态定义的),您必须使用星号来获取所有列。但是数组函数然后创建一个只有 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;

顺便说一句,这是我在 stackoverflow 上的第一篇文章(请原谅我的任何格式错误)。我使用 Postgres 版本 9.6.14。

【问题讨论】:

    标签: sql arrays postgresql record


    【解决方案1】:

    这看起来很奇怪。但与涉及整个记录的许多挑战一样,解决方案通常是使用JSON。在这种情况下:

    SELECT (SELECT array_agg(t.v)
            FROM jsonb_each_text(to_jsonb(ma.*)) t(k, v)
           ) as myarray
    FROM my_addresses ma;
    

    Here 是一个 dbfiddle。

    无论如何,您可能会发现 JSON 是解决您最终问题的更好解决方案。但是这个问题特别询问了数组。

    【讨论】:

    • 虽然这是很棒的东西,但并不是我想要的。我专门要求数组解决方案的原因是我希望保持顺序;所以 "{"Bill Gates","Somewhere Avenue", "US"},而不是 {"US", "Bill Gates","Somewhere Avenue"}。我想我应该指定那个。好奇点;为什么在您的解决方案中删除 country_code 中的括号(即我得到这个输出:“{US,Bill Gates”,"Somewhere Avenue"}", "{US,"Linus Thorvalds","Other Road"}", "{AT ,"Erwin Brandstetter","Solution Street"}")?
    • @PauldeRoos 。 . . (1) 如果您希望结果按特定顺序排列,您可以在array_agg() 中添加order by。具有讽刺意味的是(也许)将“jsonb”更改为似乎保留了原始顺序。 (2)我不知道您在引用括号时指的是什么。数据中没有“country_code”,也没有括号。
    • 我指的是 country_id,而不是 country_code。你是对的,输出中没有括号,我的意思是引号(我回复的时候还早)。关于顺序,我的意思是保留原始顺序,但想起来,因为在我的实际问题中,列实际上是编号的,所以我实际上可以使用它来获得正确的顺序。这意味着你的答案对我有用:-)
    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多