IN() 语句的 ARRAY 变量上 UNNEST 的必要性

Necessity of UNNEST on ARRAY variable for IN() statement

提问人:NCFY 提问时间:9/28/2023 更新时间:9/29/2023 访问量:49

问:

如果一直忙于寻找使用 ARRAY 变量定义

WHERE [...] IN()

HANA SQL 中的语句。当我使用 ARRAY 时,它起作用;所有其他方法都失败了。UNNEST()

我试图理解为什么。任何帮助都非常感谢。

这是行不通的

CREATE PROCEDURE UPDATE_TABLE()

AS
BEGIN
    -- Define default filter values
    DECLARE variable1 NVARCHAR(255) ARRAY = ARRAY('default_value1','default_value2');

    -- Update the specified columns for matching rows
    UPDATE TABLE
    SET
        COLUMN = '1'
    WHERE
        COLUMN IN (:variable1);
END;

这确实有效

CREATE PROCEDURE UPDATE_TABLE()

AS
BEGIN
    -- Define default filter values
    DECLARE variable1 NVARCHAR(255) ARRAY = ARRAY('default_value1','default_value2');

    -- Create table for ARRAY variable(s)
    variable1_table = UNNEST(:variable1) AS ("VAR1"); 

    -- Update the specified columns for matching rows
    UPDATE TABLE
    SET
        COLUMN = '1'
    WHERE
        COLUMN IN (SELECT "VAR1" FROM :variable1_table);
END;
SQL 变量 HANA

评论


答:

2赞 Zufar Sunagatov 9/29/2023 #1

我试图理解为什么。任何帮助都非常感谢。

在第一个示例中,直接在语句中使用数组变量。这是行不通的,因为子句中不允许使用数组。variable1IN()WHERE

在第二个示例中,使用该函数将数组变量转换为表。然后,使用 statement 从表中选择列并将其传递给 ) 语句。它的工作原理是运算符现在正在接收标量值列表。UNNEST()variable1SELECTVAR1IN(IN()

评论

0赞 NCFY 9/29/2023
好;因此,不可能在 where 子句中引用/使用数组。将数组转换为表,然后选择列是正确的方法,还是有更好的方法?
0赞 Zufar Sunagatov 9/29/2023
@NCFY 是的,您可以创建一个临时表来存储数组变量的值。然后,可以在 .WHERE IN()
0赞 NCFY 9/29/2023
这是 HANA SQL 的局限性吗?还是其他 DBMS 具有相同的约束?我只是无法在网上挖掘具体信息......可能使用了不正确的搜索词。感谢您的支持!
1赞 Zufar Sunagatov 9/29/2023
@NCFY 是的,没错。无法在子句中直接使用数组变量是 HANA SQL 的限制。其他 DBMS(如 PostgreSQL 和 MySQL)允许您直接在子句中使用数组变量。WHERE IN()WHERE IN()
0赞 NCFY 9/29/2023
我刚刚检查了本地 Postgres,id 也不接受数组。我会进一步调查,但无论如何,到目前为止谢谢你。