【问题标题】:How to clone array in PostgreSql?如何在 PostgreSql 中克隆数组?
【发布时间】:2014-05-15 12:48:43
【问题描述】:

我有这段代码:

RAISE NOTICE 'p_new_roster: %', p_new_roster; --prints {3,4,5}
FOREACH i IN ARRAY p_new_roster
LOOP
  RAISE NOTICE 'p_new_roster[i]: %', p_new_roster[i]; --prints 5,NULL,NULL (through 3 iterations)
  v_new_users := v_new_users || p_new_roster[i];
END LOOP;

为什么 p_new_roster[1] 是 5,p_new_roster[2] 是 NULL 等等?变量 i 被声明为整数,数组被声明为 integer[]。

基本上我要做的是克隆“p_new_roster”数组。如果有人知道更好的方法,我也想知道如何。

【问题讨论】:

  • PostgreSQL 数组是不可变的。为什么要“克隆”它?只是v_new_users = p_new_roster。你试图通过这样做来解决的实际问题是什么,你在这里问的“如何”的“为什么”?
  • 我有两个数组:arr1 = {1,2,3} 和 arr2 = {3,4,5}(这只是示例)。我需要比较这两个数组并在一列 {1,2} 和第二列 {4,5} 中返回的函数(我会将结果放在复合类型中)。
  • 如果我做 v_new_users := p_new_roster 那么我对 v_new_users 所做的更改也会出现在 p_new_roster 中吗?我需要 p_new_roster 供以后使用。
  • @anagarD 不。您将 p_new 的值分配给 v_new 而不是对 p_new 的引用
  • 不,您完全误解了数组在 PostgreSQL 中的工作方式。它们是不可变的。它不像Java那样分配数组只是分配引用。整个数组被复制。它就像 Java 中的字符串。您不能通过设置属性就地修改数组。

标签: arrays postgresql stored-procedures


【解决方案1】:

如果你想把空值从数组中取出来

v_new_users := v_new_users || array_remove(p_new_roster, null)

没有循环

或者只是追加

v_new_users := v_new_users || p_new_roster

也没有循环

或者您的脚本已修复

RAISE NOTICE 'p_new_roster: %', p_new_roster; --prints {3,4,5}
FOREACH i IN ARRAY p_new_roster
LOOP
  RAISE NOTICE 'p_new_roster[i]: %', i; 
  v_new_users := v_new_users || i;
END LOOP;

i 是每次迭代的数组元素值而不是数组索引

【讨论】:

  • 我坚持我是索引 -.- 谢谢你的回答有很大帮助!
猜你喜欢
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多