【问题标题】:PostgreSQL: Replace values greater than a certain limit in array elementsPostgreSQL:替换数组元素中大于某个限制的值
【发布时间】:2017-11-13 00:59:42
【问题描述】:

我的 PostgreSQL 9.5 数据库中有 3 行数组(类型、文本),如下所示:

ID     array
1      "112,292,19.3"
2      "203,383,22.1"
3      "136,226,18.9,286,346,27.1,346,406,6.5"

有一些数组元素大于 360。我想在if any array element > 360 然后element - 360 的条件下替换它们,以便替换的数组如下:

ID     array
1      "112,292,19.3"
2      "203,23,22.1"
3      "136,226,18.9,286,346,27.1,346,46,6.5"

如何替换大于 360 的值?

【问题讨论】:

  • 如果是 gt 那么 720?..
  • 360 是元素的一定限制。这就是为什么我要扫描所有大于 360 的元素。
  • 尝试mod,如我的答案示例所示。当然,它会将 721 替换为 1,而不是 361,但我有一个印象,这就是你最终想要的?..

标签: sql arrays postgresql replace conditional-statements


【解决方案1】:

Postgres 中有modulo operator %

with my_table(id, arr) as (
values
    (1, array[112,292,19.3]),
    (2, array[203,383,22.1]),
    (3, array[136,226,18.9,286,346,27.1,346,406,6.5])
)

select id, array_agg(unnest % 360 order by ordinality)
from my_table,
unnest(arr) with ordinality
group by 1;

 id |               array_agg                
----+----------------------------------------
  1 | {112,292,19.3}
  2 | {203,23,22.1}
  3 | {136,226,18.9,286,346,27.1,346,46,6.5}
(3 rows)

【讨论】:

  • 可能更紧凑(我相信订单存储):select id, array(select unnest(arr) % 360) from my_table;
  • 这个假设有点冒险。当您将来添加某些内容(例如 where 条件)时,您会惊讶于订单为何会更改。
  • 是的。但另一方面,我们不需要额外的内存来连接结果和额外的分组扫描。风险与效率:)
【解决方案2】:

试试https://www.postgresql.org/docs/9.5/static/functions-math.html mod

y/x 的余数

例如:

x=# with a as (select * from unnest(array[136,226,18.9,286,346,27.1,346,46,6.5]) with ordinality a(i,o))
select array_agg(mod(i,360) order by o) from a;
               array_agg
----------------------------------------
 {136,226,18.9,286,346,27.1,346,46,6.5}
(1 row)

【讨论】:

    猜你喜欢
    • 2013-11-09
    • 2016-05-03
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2018-02-15
    • 2023-03-15
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多