我正在尝试使用in子句编写一个简单的查询,如下所示:
SELECT *
FROM storeupcsalesbyday
WHERE date >= '9/1/2020' AND date <= '9/10/2020' AND upc in ('0000000004011', '0000000094011')
我需要能够将in子句中的值作为参数传递,in子句中的值数是可变的,取决于用户输入,它可以是一个或数千个。在其他sql数据库中,我通过创建一个用户定义的函数来解决此问题,该函数接受一个字符串,在定界符上将其拆分,并将值插入到临时表中,然后从临时表中选择所有要在我的in子句中使用的函数。但是,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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句