0

我们正在使用 Matillion ETL API 将查询参数传递给底层的 Redshift 查询。使用下拉列表中的连接创建查询参数变量,States并在 API 中传递,如下所示:

v_state=" & #encodeForURL("''AL'',''CA''")#

这个变量应该像and state in ('AL','CA')在查询中一样被传递,但由于它的存在,,使用保留字符会引发错误。我试过逃避这个角色,但它仍然不起作用。

因此,,我没有|在变量中使用v_state=" & #encodeForURL("''AL''|''CA''")# 它,它确实运行 API,但底层查询不返回任何数据。

and state in ('AL','CA') (返回数据)

and state in (replace('''AL''|''CA''','|',','))(不返回数据)

问题是:

  1. 在 Matillion API 中,有没有办法在字符串中转义逗号?
  2. 在 Redshift 中为 IN 子句使用管道分隔字符串的正确方法是什么?

编辑 1:找到一种将状态字符串转换为行的方法。

    with t as
        (select replace('AL|CO|CA|MN', '|', ',') as state)
   , seq_0_9 as (
    select 0 as num
    union all
    select 1 as num
    union all
    select 2 as num
    union all
    select 3 as num
    union all
    select 4 as num
    union all
    select 5 as num
    union all
    select 6 as num
    union all
    select 7 as num
    union all
    select 8 as num
    union all
    select 9 as num
)
   , seq_0_99 as (
    select a.num + b.num * 10 as num
    from seq_0_9 a,
         seq_0_9 b
)
SELECT split_part(t.state, ',', num) AS state
FROM t
         JOIN seq_0_99 seq
              ON num <= regexp_count(t.state, ',') + 1
WHERE num > 0;
4

1 回答 1

1

感谢您的确认。我不确定您是如何使用 Matillion REST API 中的变量遇到字符转义问题的,因为变量是通过 POST 正文传入的?

无论如何,这对我有用:

创建一个名为 EntryPointJob 的编排作业,其作业变量设置如下。

在此处输入图像描述

在哪里

  • jv_commasep 是公共输入,预计包含类似AL,CA
  • pjv_inlist 是一个私有变量,它被更新以包含 SQL 兼容格式的相同信息,例如'AL','CA'

我使用 Python3 脚本通过以下代码从 jv_commasep 派生 pjv_inlist:

context.updateVariable('pjv_inlist', ','.join(["'" + x.strip() + "'" for x in jv_commasep.split(',')]))

现在,在 Matillion 作业中,您可以在 SQL 中使用 pjv_inlist 变量,例如:... WHERE "state" IN (${pjv_inlist})

要运行作业并传递标量变量,您首先需要创建一个如下所示的 JSON 文件。我命名了我的 RunVariablesContainer.json

{
  "scalarVariables" : {
    "jv_commasep" : "AL,CA"
  }
}

然后您可以调用 Matillion 自己的 REST API 来运行 Matillion 作业(带参数),如下所示:

curl -k -X POST -u un:pw -H "Content-type: application/json" "https://.../rest/v1/group/name/.../project/name/.../version/name/.../job/name/EntryPointJob/run?environmentName=Demo" --data-binary @RunVariablesContainer.json
于 2021-12-23T14:03:57.453 回答