我想在类似SELECT的SQL语句中使用数组参数绑定,就像下面的例子一样(请注意limit0
CTE(
WITH
limit0(val)
AS
(
SELECT * FROM (?)
),
total(limit0val)
AS
(
SELECT DISTINCT limit0.val
FROM limit0
)
SELECT total.limit0val
FROM total;
?
的输入值是一个值数组,我想将这些值用作任何其他CTE(过滤、加入等(问题是我找不到将数组绑定到SELECT语句中的方法。
有人能帮助我,如何重构这个查询吗?
应用的代码堆栈:
- c++
- ODBC
- 雪花&Redshift法规遵从性SQL
反思评论:
- VALUES子句不受Redshift(AFAIK(支持
- 参数数组不能是查询的一部分,因为它可能超过最大查询长度
您不能绑定数组,但可以创建一个分隔字符串,并使用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帮助。