Postgres:选择多个列并与数组比较

时间:2020-11-10 11:30:18

标签: sql postgresql plpgsql

我想在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)

1 个答案:

答案 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?不过,使用数组也可以很容易地达到同样的目的。