sql - 如何将要分隔的列表、数组或字符串作为参数传递给 redshift

标签 sql amazon-web-services amazon-redshift

我正在尝试编写一个带有 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/

相关文章:

c# - SQL登录系统

amazon-web-services - Boto3 DMS 'modify_replication_task' 复制任务设置 JSON 错误

amazon-web-services - 在亚马逊 AWS 上部署 TCP/IP 和 UDP 服务的最佳架构(无 EC2 实例)

amazon-web-services - Amazon Redshift - 复制 - 数据加载与查询性能问题

mysql - 如何合并两个具有不同 where 条件的更新查询

c# - 我的 SQL 表设置为允许此列为 NULL,但是当我运行它时,它说它不能为 NULL。什么/为什么/如何?

amazon-redshift - redshift datediff 在使用 current_timestamp 时不起作用,但在使用 getdate() 函数时起作用

intellij-idea - Redshift 查询永远挂起并且 PG_TERMINATE_BACKEND 不起作用

sql - 查找连续模式(使用 SQL)

amazon-web-services - 使用 Terraform for ECS 在 CloudWatch 中包含退出代码 1 事件