我想在Postgres 12数据库中的一个PL / PGSQL函数中执行以下操作(用某种简化的伪代码编写):
SELECT numcolA, numcolB FROM myitemtable INTO _unused_items_array;
FOR EACH _numcol1, _numcol2 IN SELECT num_col1, num_col2 FROM some_items_table LOOP
IF CONTAINS(_unused_items_array, [_numcol1, _numcol2]) THEN
REMOVE_ARRAY_ITEM_IF_EXISTS(_unused_items_array, [_numcol1, _numcol2]);
-- following lines containing REMOVE_ARRAY_ITEM_IF_EXISTS are simplified
-- they will be in real life much more difficult to calculate
REMOVE_ARRAY_ITEM_IF_EXISTS(_unused_items_array, [_numcol1 - 1, _numcol2 - 1]);
REMOVE_ARRAY_ITEM_IF_EXISTS(_unused_items_array, [_numcol1 + 3, _numcol2 + 3]);
END IF;
END LOOP
SELECT numcolA, numcolB FROM myitemtable INTO _used_items_array;
FOR EACH _unused_item IN _unused_items_array
REMOVE_ARRAY_ITEM_IF_EXISTS(_used_items_array, _unused_item);
这不能仅在SQL中完成,因为计算(上面的注释)比此处编写的要复杂得多。
因此,有人知道我如何使用PL / PGSQL解决它吗–因为PL / PGSQL中的数组函数使我疯狂地解决了这个问题(在C#中将在一秒钟内完成-但没有选择)
加法(编辑) 根据要求,我添加了一些示例数据来解释要求:
myitemtable
包含(以及其他)以下列:
+ -------------- + -------------- +
| numcolA | numcolB |
+ -------------- + -------------- +
| 1 | 1 |
+ -------------- + -------------- +
| 1 | 2 |
+ -------------- + -------------- +
| 2 | 5 |
+ -------------- + -------------- +
| 2 | 9 |
+ -------------- + -------------- +
some_items_table
包含(以及其他)以下列:
+ -------------- + -------------- +
| num_col1 | num_col2 |
+ -------------- + -------------- +
| 1 | 2 |
+ -------------- + -------------- +
| 2 | 9 |
+ -------------- + -------------- +
在if条件下,还会有其他一些“虚拟计算”的项目,让我们说(1|1), (1|3), (2|2), (2|8), (2|10), (3|9)
,它将检查这些项目是否在_unused_items_array中(如果它们在-中,则将被删除,例如您可以看到)。
在示例中,所有这些最终都将导致一个_used_items_array,该数组仅包含项(2|5)
。
答案 0 :(得分:0)
有许多种方式可以做到这一点,普通的SQL DELETE
可能是“最简单的”:
DELETE FROM myitemtable m
USING some_items_table s
WHERE (m.numcolA , m.numcolB) IN (
(s.num_col1, s.num_col2) -- row values from some_items_table
, (1,1), (1,3), (2,2), (2,8), (2,10), (3,9) -- "virtually calculated" row values
);
db <>提琴here
这是在比较ROW值。不要忘记在这种测试中NULL值不等于相等。相关:
如果需要,可以将语句嵌套在PL / pgSQL函数中。
似乎不需要数组。 XY problem?不过,使用数组也可以很容易地达到同样的目的。