Azure数据工厂-如何在表达式构建器中使用if条件构建查询?

but5z9lq  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(106)

我在复制活动中有下面的查询,用于将数据从表列表复制到目标中。我使用foreach活动来复制数组参数-表。现在一些表名包含schema作为前缀,所以我需要从表名中提取schema名称并构造查询。如果表名不包含schema名称,则查询应采用管道中作为参数给出的默认名称。

below is the parameter and value
default_schema_parameter=myschema
tables= ["testschema_table1", "table2","prodschema_table2"]

字符串
有两个表包含架构名称

prodschema_table2
testschema_table1
prod_cust_table1


现在我想构造这样的查询作为sudo代码
预期数量

if tables item contains '_':
   select * from item.replace with '.'
else:
   select * from default_schema_parameter.item

expected query:
1.select * from prodschema.table2
2.select * from default_schema_parameter.table2
3.select * from prod.cust_table1 -- only first part spliting


我尝试了下面的方法

@concat('SELECT * FROM ',
    if(contains(item(), '_'),
        concat(replace(split(item(), '_')[0], ' ', ''), '.', split(item(), '_')[1]),  -- Construct schema.table if '_' is present
        concat('@{default_schema_parameter}.', item())  -- Construct default_schema_parameter.table if no '_'
    )
)


但上面的代码不工作.我得到下面的错误

concat(replace(split(item(), '_')[0],

cannot fit unknown into the function parameter


对此有什么解决办法吗

6tqwzwtp

6tqwzwtp1#


的数据
这不是一个错误,它只是一个警告,当我们在字符串表达式中使用split()[index]函数时发生。
像下面这样改变你的表达式并调试管道。

@concat('SELECT * FROM ',
    if(contains(item(), '_'),
        concat(split(item(), '_')[0], '.', split(item(), '_')[1]),
        concat(pipeline().parameters.default_schema_parameter,'.',item())
    )
)

字符串
它不会给管道调试给予任何错误。


更新:

我想只分割第一次出现的_”,所以它应该是'prod.cust_table1',但目前上述代码使分割在所有出现的prod.cust.table1。
使用下面的动态表达式来实现此要求。

@concat('SELECT * FROM ',
    if(contains(item(), '_'),
        concat(split(item(), '_')[0], '.', replace(item(),concat(split(item(), '_')[0],'_'),'')),
        concat(pipeline().parameters.default_schema_parameter,'.',item())
    )
)


此表达式将给予表名,方法是将字符串"schema_"替换为当前@item()中的空字符串('')。


相关问题