代码之家  ›  专栏  ›  技术社区  ›  Przemyslaw Remin

条件列中的Powerquery IN运算符

  •  0
  • Przemyslaw Remin  · 技术社区  · 6 年前

    如何修改此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])
    

    此处使用: https://stackoverflow.com/a/51749519/1903793

    2 回复  |  直到 6 年前
        1
  •  1
  •   Foxan Ng    6 年前

    你必须使用 List.Transform Text.Contains 函数调用,然后使用 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")
    

    结果:

    enter image description here

    Reference

        2
  •  3
  •   Sergey Lossev Alejandro Lopez-Lago - MSFT    6 年前

    如果你想比较整个单词,你应该用 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
    
        3
  •  1
  •   Paul M Sorauer    5 年前

    List.Accumulate(YOUR_LIST_OF_STRINGS, null, (state, current) => if Text.Contains([YOUR COLUMN NAME], current) then current else state)
    

    此方法的唯一缺点是,如果有多个匹配项,则只返回最后一个。。。

    List.Accumulate(YOUR_LIST_OF_STRINGS, {}, (state, current) => if Text.Contains([YOUR COLUMN NAME], current) then List.Combine({{current}, state}) else state)
    

    或者您可以修改它,使其以字符串等形式返回逗号分隔的列表。