我正在尝试编写一个带有 in 子句的简单查询,如下所示:
SELECT *
FROM storeupcsalesbyday
WHERE date >= '9/1/2020' AND date <= '9/10/2020' AND upc in ('0000000004011', '0000000094011')
我需要能够将 in 子句中的值作为参数传递,in 子句中的值的数量是可变的,可以是一个或数千个,具体取决于用户输入。在其他 SQL 数据库中,我通过创建一个用户定义的函数解决了这个问题,该函数接受一个字符串,将其拆分为分隔符并将值插入临时表中,然后我将从临时表中选择所有值以在我的 in 子句中使用。但是,redshift 中的用户定义函数不允许将表作为返回类型。其他人如何在 Redshift 中解决这个问题。
谢谢
最佳答案
我能够创建一个存储过程,它采用 varchar 并创建由分隔符(在本例中为“,”)分隔的 varchar 的所有“切片”的临时表。我只是想在这里分享,以防其他人遇到这个问题。
程序如下:
CREATE OR REPLACE Procedure sp_UPCStringToTempTable(upcList IN varchar(max))
AS 'DECLARE
idx int;
slice varchar(8000);
upcListVar varchar(max);
BEGIN
idx = 1;
upcListVar = upcList;
DROP TABLE if exists tmp_upc;
CREATE TEMP TABLE tmp_upc(upc varchar(14));
WHILE idx != 0 LOOP
idx = charindex('','', upcListVar);
IF idx != 0 THEN
slice = left(upcListVar, idx - 1);
END IF;
IF idx = 0 THEN
slice = upcListVar;
END IF;
IF len(slice) > 0 THEN
INSERT INTO tmp_upc values (slice);
END IF;
upcListVar = right(upcListVar, len(upcListVar) - idx);
END LOOP;
END;
' LANGUAGE plpgsql;
关于sql - 如何将要分隔的列表、数组或字符串作为参数传递给 redshift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63855394/