将PostgreSQL bigint数组唯一值移动到另一个索引

热内姆

如何将数组bigint值从一个索引移动到另一个索引?例如,我有一个ARRAY[1, 2, 3, 4]bigintunique数组想将值1移动到索引3,所以最终结果将是ARRAY[2, 3, 1, 4]

假设:

  1. 数组中的元素由值标识。

  2. 保证元素的唯一性。

  3. 任何元素都可以移动到任何地方。

  4. 空值不涉及任何方面。

  5. 如果没有,则该值包含在数组中。我们有2个选项。首先是什么都不做,其次是通过异常机制处理此异常。这是一个极端的情况,只能由于某些错误而发生

  6. 数组是一维的。

欧文·布兰德斯特

一般假设:

简单的解决方案

CREATE FUNCTION f_array_move_element_simple(_arr bigint[], _elem bigint, _pos int)
  RETURNS bigint[] LANGUAGE sql IMMUTABLE AS
'SELECT a1[:_pos-1] || _elem || a1[_pos:] FROM array_remove(_arr, _elem) a1'

一切正常,只要:

  • 给定的元素实际上包含在数组中。
  • 给定位置在1和数组的长度之间。

正确的解决方案

CREATE FUNCTION f_array_move_element(_arr ANYARRAY, _elem ANYELEMENT, _pos int)
  RETURNS ANYARRAY AS
$func$
BEGIN
   IF _pos IS NULL OR _pos < 1 THEN
      RAISE EXCEPTION 'Target position % not allowed. Must be a positive integer.', _pos;
   ELSIF _pos > array_length(_arr, 1) THEN
      RAISE EXCEPTION 'Target position % not allowed. Cannot be greater than length of array.', _pos;
   END IF;

   CASE array_position(_arr, _elem) = _pos  -- already in position, return org
      WHEN true THEN
         RETURN _arr;
      WHEN false THEN                       -- remove element
         _arr := array_remove(_arr, _elem);
      ELSE                                  -- element not found
         RAISE EXCEPTION 'Element % not contained in array %!', _elem, _arr;
   END CASE;

   RETURN _arr[:_pos-1] || _elem || _arr[_pos:];
END
$func$  LANGUAGE plpgsql IMMUTABLE;

如果违反了简单函数的任何其他假设,则会引发异常。

只要数组和元素类型匹配,“适当的”函数就可以使用多态类型并适用于任何数据类型,而不仅限bigint于此。

db <>在这里拨弄

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将数组值移动到另一个特定的数组

如何将数组的值从一个数组移动到另一个 [Javascript]

将数组结果从一个json对象移动到另一个

将值从一个表移动到另一个表

将字典 python 中的元素移动到另一个索引

Mongodb如何将特定对象从数组移动到另一个数组?

将 CollectionViewCell 移动到另一个部分

将数据移动到另一个表

将文件移动到另一个分支

将服务移动到另一个分区

将数组元素从一个数组位置移动到另一个位置

Javascript:尝试将项目从一个数组随机移动到另一个数组

如何根据 id_item 将元素移动到另一个数组

将元素从$ pull移动到另一个数组

如何将唯一指针从一个向量移动到另一个唯一指针向量?

如何将变量的值移动到汇编中的另一个变量

将SQL Server表列值移动到另一个表列

可排序:将值移动到另一个组

使用 jQuery 将值移动到另一个表单

将笔记的值复制/移动到另一个笔记

将所有数组值移动到一个索引

将数据从一个Numpy数组移动到另一个返回不正确的数据

如何使用数组将文件从一个目录移动到另一个目录

PYTHON:将字典中的值从一个键移动到另一个键

将表 postgresql 的一部分移动到另一个数据库

将更改从一个分支移动到另一个分支

C:将元素从一个列表移动到另一个列表

强制将 Pod 从一个工作节点移动到另一个

将角度分量从一个容器移动到另一个容器