Как этот код 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

0
Przemyslaw Remin 20 Авг 2018 в 12:37

3 ответа

Лучший ответ

Вы должны использовать 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

Справка

1
Foxan Ng 20 Авг 2018 в 10:52

Если вы хотите сравнить целое слово, вы должны использовать функцию 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
Sergey Lossev 31 Авг 2018 в 23:54

Или, если вы хотите вернуть соответствующую строку, вы можете использовать функцию List.Accumulate:

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)

Или вы можете изменить это так, чтобы он возвращал список с разделителями-запятыми в виде строки и т. Д., Или как угодно.

1
Paul M Sorauer 27 Июн 2019 в 03:44
51927925