【问题标题】:Vector arithmetic for arrays in postgrespostgres中数组的向量算术
【发布时间】:2020-12-27 22:59:12
【问题描述】:

似乎 postgres 原生支持带有操作符的数组附加:

||  array-to-array concatenation    ARRAY[1,2,3] || ARRAY[4,5,6]    {1,2,3,4,5,6}

来源:https://www.postgresql.org/docs/current/functions-array.html

它本身是否支持向量/元素的算术运算(即,无需为其编写新函数?)

例如:

[1,2,3] + [1,1,1] = [2,3,4]
[1,2,3] - [1,1,1] = [0,1,2]
[1,2,3] * [2,2,2] = [2,4,6]
[1,2,3] / [2,2,2] = [.5, 1, 1.5]

相关问题在这里:Vector (array) addition in Postgres,虽然它大约有 6 年的历史,所以也许从那时起 postgres 发生了变化?

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案1】:

    Postgres 没有支持这种算术的“数字数组”的概念。但是,使用数组原语很容易实现。例如:

    select t.*,
           (select array_agg(e.el1 * e.el2)
            from unnest(t.ar1, t.ar2) e(el1, el2)
           ) ar
    from (select array[1,2,3] as ar1,  array[4,5,6] as ar2) t;
    

    unnest() 按元素顺序“解压缩”两个数组。然后数组 agg 根据您想要的数学运算“重新压缩”它们。

    实际上,Postgres 确实使用子查询保留了数组的顺序。但如果你想明确一点,请使用with ordinality

    select t.*,
           (select array_agg(e.el1 * e.el2 order by n)
            from unnest(t.ar1, t.ar2) with ordinality e(el1, el2, n)
           ) ar
    from (select array[1, 2, 3] as ar1,  array[4, 5, 6] as ar2) t
    

    【讨论】:

      【解决方案2】:

      如果您安装intarray module,您可以获得一些新函数和运算符的一些好处,但对算术运算没有任何好处。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-27
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 2016-03-26
        • 2015-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多