如何将数组bigint值从一个索引移动到另一个索引?例如,我有一个ARRAY[1, 2, 3, 4]
bigintunique
值数组,想将值1移动到索引3,所以最终结果将是ARRAY[2, 3, 1, 4]
假设:
数组中的元素由值标识。
保证元素的唯一性。
任何元素都可以移动到任何地方。
空值不涉及任何方面。
如果没有,则该值包含在数组中。我们有2个选项。首先是什么都不做,其次是通过异常机制处理此异常。这是一个极端的情况,只能由于某些错误而发生
数组是一维的。
一般假设:
UNIQUE NOT NULL
。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'
一切正常,只要:
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] 删除。
我来说两句