条件列中的 Powerquery IN 运算符
Powerquery IN operator in conditional column
如何修改这个m Power BI M代码
= Table.AddColumn(#"PreviousStep", "Tag", each
if Text.Contains([Column1]) = "value1" then "bingo"
else if Text.Contains([Column1]) = "value2" then "bingo"
else if Text.Contains([Column1]) = "value3" then "bingo"
else ["Some other value"])
变成类似于 SQL
的一行代码
case when [Column1] in ("value1", "value2", "value3") then "bingo" else "Some other value" end
我不想重复 else if
行,但采用与
类似的方式
List.Contains({'Value1', 'Value2', 'Value3'}, [Column1])
此处使用:
您必须使用 List.Transform to generate the Text.Contains function call, then use List.AnyTrue 检查 Column1
是否包含任何文本。
= Table.AddColumn(#"PreviousStep", "Tag", each if List.AnyTrue(List.Transform({"value1", "value2", "value3"}, (s) => Text.Contains([Column1], (s)))) then "bingo" else "Some other value")
结果:
如果你想比较整个单词,你应该使用List.ContainsAny
函数
let
haystack = #table({"col"}, {{"qwer"}, {"asdf"}, {"zxcv"}, {"zxwecv"}, {"other"}}),
needles = {"qwer", "zxcv"},
add = Table.AddColumn(haystack, "Tag", each if List.ContainsAny(needles, {[col]}) then "bingo" else "Some other value")
in
add
但是如果你搜索单词的一部分,答案就会变得有点复杂
let
haystack = #table({"col"}, {{"qwer"}, {"asdf"}, {"zxcv"}, {"zxwecv"}, {"other"}}),
needles = {"we", "as"},
add = Table.AddColumn(haystack, "Tag", each if List.MatchesAny(needles, (s)=>Text.Contains([col], s)) then "bingo" else "Some other value")
in
add
或者想return匹配的字符串,可以使用List.Accumulate函数:
List.Accumulate(YOUR_LIST_OF_STRINGS, null, (state, current) => if Text.Contains([YOUR COLUMN NAME], current) then current else state)
此方法的唯一缺点是,如果有多个匹配项,它将 return 只有最后一个...
这是一个更复杂的版本,return是匹配字符串的列表:
List.Accumulate(YOUR_LIST_OF_STRINGS, {}, (state, current) => if Text.Contains([YOUR COLUMN NAME], current) then List.Combine({{current}, state}) else state)
或者您可以对其进行修改,使其 return 是一个以逗号分隔的列表作为字符串等,或其他任何内容。
如何修改这个m Power BI M代码
= Table.AddColumn(#"PreviousStep", "Tag", each
if Text.Contains([Column1]) = "value1" then "bingo"
else if Text.Contains([Column1]) = "value2" then "bingo"
else if Text.Contains([Column1]) = "value3" then "bingo"
else ["Some other value"])
变成类似于 SQL
的一行代码case when [Column1] in ("value1", "value2", "value3") then "bingo" else "Some other value" end
我不想重复 else if
行,但采用与
List.Contains({'Value1', 'Value2', 'Value3'}, [Column1])
此处使用:
您必须使用 List.Transform to generate the Text.Contains function call, then use List.AnyTrue 检查 Column1
是否包含任何文本。
= Table.AddColumn(#"PreviousStep", "Tag", each if List.AnyTrue(List.Transform({"value1", "value2", "value3"}, (s) => Text.Contains([Column1], (s)))) then "bingo" else "Some other value")
结果:
如果你想比较整个单词,你应该使用List.ContainsAny
函数
let
haystack = #table({"col"}, {{"qwer"}, {"asdf"}, {"zxcv"}, {"zxwecv"}, {"other"}}),
needles = {"qwer", "zxcv"},
add = Table.AddColumn(haystack, "Tag", each if List.ContainsAny(needles, {[col]}) then "bingo" else "Some other value")
in
add
但是如果你搜索单词的一部分,答案就会变得有点复杂
let
haystack = #table({"col"}, {{"qwer"}, {"asdf"}, {"zxcv"}, {"zxwecv"}, {"other"}}),
needles = {"we", "as"},
add = Table.AddColumn(haystack, "Tag", each if List.MatchesAny(needles, (s)=>Text.Contains([col], s)) then "bingo" else "Some other value")
in
add
或者想return匹配的字符串,可以使用List.Accumulate函数:
List.Accumulate(YOUR_LIST_OF_STRINGS, null, (state, current) => if Text.Contains([YOUR COLUMN NAME], current) then current else state)
此方法的唯一缺点是,如果有多个匹配项,它将 return 只有最后一个...
这是一个更复杂的版本,return是匹配字符串的列表:
List.Accumulate(YOUR_LIST_OF_STRINGS, {}, (state, current) => if Text.Contains([YOUR COLUMN NAME], current) then List.Combine({{current}, state}) else state)
或者您可以对其进行修改,使其 return 是一个以逗号分隔的列表作为字符串等,或其他任何内容。