来自绑定数组参数的SQL CTE



我想在类似SELECT的SQL语句中使用数组参数绑定,就像下面的例子一样(请注意limit0CTE(

WITH
limit0(val)
AS
(
SELECT * FROM (?)
),
total(limit0val)
AS
(
SELECT DISTINCT limit0.val
FROM limit0
)
SELECT total.limit0val
FROM total;

?的输入值是一个值数组,我想将这些值用作任何其他CTE(过滤、加入等(问题是我找不到将数组绑定到SELECT语句中的方法。

有人能帮助我,如何重构这个查询吗?

应用的代码堆栈:

  1. c++
  2. ODBC
  3. 雪花&Redshift法规遵从性SQL

反思评论:

  1. VALUES子句不受Redshift(AFAIK(支持
  2. 参数数组不能是查询的一部分,因为它可能超过最大查询长度

您不能绑定数组,但可以创建一个分隔字符串,并使用STRTOK_TO_ARRAY函数将其解析为数组:

select strtok_to_array('MEMBER_1,MEMBER_2,MEMBER_3', ',') as MY_ARRAY;

您可以指定要使用的分隔符。然后,您可以使用这样的字符串绑定变量:

select strtok_to_array(?, ',') as MY_ARRAY;

因此,如果我们从一些有效的SQL开始:

因此,数组参数可能意味着我将传入任意的值数组,因此您希望SQL有效:

WITH limit0(val) AS (
SELECT * FROM VALUES (0),(1),(0),(1),(2)
), total(limit0val) AS (
SELECT DISTINCT limit0.val 
FROM limit0
)
SELECT total.limit0val
FROM total;

因此输入可能是(0),(1),(0),(1),(2)或你可能是说我有一个数组,我将其作为单个字符串值传递,并在SQL中进行解析,因此:

WITH limit0(val) AS (
SELECT try_to_number(t.value) FROM TABLE(split_to_table('0, 1, 0, 1,2', ',')) t
), total(limit0val) AS (
SELECT DISTINCT limit0.val 
FROM limit0
)
SELECT total.limit0val
FROM total;

可以使用,并且输入将是单个参数'0, 1, 0, 1,2'

后者对我来说似乎更容易。

我还假设您已经阅读了ODBC Binding Parameters to Array Variables For Batch Inserts帮助。

最新更新