存储过程-在SQL查询中使用数组列表在雪花中插入

时间:2020-05-29 11:03:27

标签: snowflake-cloud-data-platform

如果我在存储过程中的处理过程中创建/生成了元素列表,请说rownum = [1,2,3,4]。 现在,我想在sql语句中使用此列表来过滤掉行,然后说出select * from mytable,其中rownum不在同一存储过程中的(1,2,3,4)中。 我怎样才能做到这一点? 请指导。 谢谢

2 个答案:

答案 0 :(得分:0)

雪花具有ARRAY_CONTAINS(,)函数。

示例: Array_Contains(5,array_construct(1,2,3,4))

答案 1 :(得分:0)

对此的一般解决方案是使用binding variables。但是,集类型目前不支持为bind variables in the Stored Procedure APIs

JavaScript API确实允许您使用string and array transform functions动态生成SQL,因此可以采用以下方法来解决此问题。

通过形成一组值的SQL语法,将值列表内联到查询中:

CREATE OR REPLACE PROCEDURE SAMPLE()
    RETURNS RETURNTYPE
    LANGUAGE JAVASCRIPT
    AS
    $$
      var lst = [2, 3, 4]
      var lstr = lst.join(',') // "2, 3, 4"
      var sql_command = `SELECT * FROM T WHERE C NOT IN (${lstr})` // (2, 3, 4)
      var stmt = snowflake.createStatement( {sqlText: sql_command} )
      // Runs: SELECT * FROM T WHERE C NOT IN (2, 3, 4) [Literal query string]
      [...]
    $$;

或者如果使用的值列表可能不安全,则可以生成查询以仅携带正确数量的绑定变量:

CREATE OR REPLACE PROCEDURE SAMPLE()
    RETURNS RETURNTYPE
    LANGUAGE JAVASCRIPT
    AS
    $$
      var lst = [2, 3, 4]
      var lst_vars = Array(lst.length).fill("?").join(", ") // "?, ?, ?"
      var sql_command = `SELECT * FROM T WHERE C NOT IN (${lst_vars})` // (?, ?, ?)
      var stmt = snowflake.createStatement( {sqlText: sql_command, binds: lst} )
      // Runs: SELECT * FROM T WHERE C NOT IN (2, 3, 4) [After bind-substitution]
      [...]
    $$;
相关问题