使用M语言提取和替换SQL查询中的参数

时间:2019-01-31 09:29:02

标签: powerquery m

此问题与this question有关。但是,在这个问题上,我做出了一些错误的假设...

我有一个包含SQL查询的字符串,带有或不带有一个或多个参数,每个参数的前缀都带有“&”(“&”号)。 现在,我要提取所有参数,并将它们加载到excel中的表中,用户可以在其中输入每个参数的值。 然后,我需要使用这些值替代SQL查询中的变量,以便我可以运行查询...

我面临的问题是提取(并因此替换)参数名称并不是那么简单,因为参数并不总是被空格包围(正如我在上一个问题中所假定的那样)

请参阅以下示例

Select * from TableA where ID=&id;

Select * from TableA where (ID<&ID1 and ID>=&ID2);

Select * from TableA where ID = &id ;

所以,我的问题有两个部分:

  1. 如何提取所有参数
  2. 如何使用另一个定义了替换项的表替换所有参数(另请参见my previous question

1 个答案:

答案 0 :(得分:1)

一个完整的解决方案需要详细了解数据的结构方式,并且可能涉及很多主题。由于您已经介绍了进行批量查找/替换的一种方法(在Power Query中有多种方法可以完成),因此,我仅向您展示我提取参数的难看解决方案。

List.Transform
(
  List.Select
  (
   Text.Split([YOUR TEXT HERE], " "), each Text.Contains(_,"&")
  ), 
  each List.Accumulate
      (
       {";",")"}, <--- LIST OF CHARACTERS TO CLEAN
       "&" & Text.AfterDelimiter(_, "&"),
       (String,Remove) => Text.Replace(String,Remove,"")
      ) 
)

这有点令人费解,但这是我能解释的最好的事情。

第一个关键部分是将List.Select与Text.Split组合在一起,以将字符串中的所有参数提取到一个列表中。它使用“”分隔列表中的单词,然后过滤为包含“&”的单词,这在第二个示例中意味着列表将包含“(ID <&ID1”和“ ID> =&ID2);”。此时。

第二部分是使用Text.AfterDelimiter提取在参数列表中“&”之后出现的文本,并使用List.Accumulate来“清除”任何可能挂在参数上的不需要的字符。您要清除的字符列表必须手动定义(我只是根据示例数据输入了“;”和“)”)。我们还手动在参数上附加了“&”,因为Text.AfterDelimiter会删除它。

此操作的结果是一个List对象,该对象从您提供的任何示例字符串中提取了参数。您可以设置查询以获取SQL字符串表,并将此代码应用于自定义列,其中[YOUR TEXT HERE]是包含字符串的字段,然后展开结果列表并删除重复项以获取唯一列表SQL字符串中的所有参数。