提取和使用M-语言替代SQL查询参数(extract and replace parameters

2019-11-05 10:59发布

这个问题与有关这个问题 。 然而,在这个问题,我做了一些错误的假设?

我有一个包含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. 我怎样才能利用将替换被定义的另一个替换表中的所有参数(见我刚才的问题 )

Answer 1:

这种完整的解决方案将需要进入你的数据是如何构造的细节,并会潜在地涵盖了很多话题。 既然你已经覆盖到做大规模查找/替换(其中有多种方式在功率查询来完成)的一种方式,我就告诉你我的丑陋的解决方案,以提取参数。

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会删除它。

这样做的结果是从任何你提供的样本串的提取的参数的列表的对象。 您可以设置这需要你的SQL字符串表,在自定义列,其中[您的文本这里]是包含你的字符串领域应用此代码查询,然后展开产生的名单,并取消对他们重复获得一个唯一列表在你的SQL字符串的所有参数。



文章来源: extract and replace parameters in SQL query using M-language
标签: powerquery m