![在 PowerQuery SQL 查询中参数化 IN 子句](https://linux22.com/image/1488269/%E5%9C%A8%20PowerQuery%20SQL%20%E6%9F%A5%E8%AF%A2%E4%B8%AD%E5%8F%82%E6%95%B0%E5%8C%96%20IN%20%E5%AD%90%E5%8F%A5.png)
我见过例子(和编码的)使用从电子表格的表中单元格读取的值来参数化 PowerQuery SQL 语句。但这些总是处理简单的逻辑条件,如myField = <parameter>
。我想参数化一个 IN 子句(myField IN <values>
),其中从 Excel 表中读取任意数量的values
(也在同一个文件中)。有人知道怎么做吗?
答案1
虽然很丑,但是似乎有效。
- 创建 PQ 查询以捕获所需参数值的单列“parameterValue”表
- 添加虚拟列并按虚拟列对所有行进行分组
- 使用 Text.Combine 创建参数列表并删除其他列
- 深入到单元格值
- 创建不带 IN 子句的所需 SQL 查询(使用“select top 1...”以提高效率)
- 使用高级编辑器,修改 SQL 查询删除“top 1”,并接受步骤 1 中的查询作为 IN 参数
查询1:
let
source = *yourData*,
addDummy = Table.AddColumn(source, "Custom", each 1),
group = Table.Group(addDummy, {"Custom"}, {{"Count", each _, type table}}),
string = Table.AddColumn(group, "queryString", each Text.Combine([Count][parameterValue],"','")),
removeOtherColumns = Table.SelectColumns(string,{"queryString"}),
queryString = removeOtherColumns{0}[queryString]
in
queryString
然后
查询2:
let
Source = Sql.Database("*serverName*", "*dbName*", [Query=
Text.Replace("
select * from x
where parameterValue in('" & query1 & ")", ")", "')" )
])
in
Source
答案2
Ken Puls 在他的博客中撰写了一篇关于使用 Power Query 参数表的精彩文章:http://www.excelguru.ca/blog/2014/11/26/building-a-parameter-table-for-power-query/
执行摘要:为参数建立一个表,编写一个函数来读取指定的参数,在 M 代码中使用该函数动态应用所需的参数。
您可能需要扩展此方法以将 SQL 语句构建为字符串。
答案3
我将首先构建一个 Power Query,例如“值”,以读取 Excel 表格行。我将设置“加载到”=“仅连接”。
然后在主要的基于 SQL 的查询中,我将与该新的“值”查询合并,并设置连接类型 = 内部。