此问题与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 ;
所以,我的问题有两个部分:
答案 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字符串中的所有参数。