Примечание: см. Самый конец для версии, которая не требует жесткого кодирования значений .
Сначала давайте проверим, является ли поисковый фильтр допустимым значением. Если нет, ничего не фильтруйте.
if IslandChoice is "NI" or "SI"
then filter using IslandChoice
else
show everything
Другой маршрут -
if IslandChoice is not "NI" and is not "SI"
show everything
else
filter using IslandChoice
Это зависит от того, хотите ли вы, чтобы недопустимые значения не показывали ничего или все.
Первая проверка "является ли этот фильтр допустимым выбором?
[Island] = "SI" or [Island] = "WI"
Если один из них является истинным, то это хорошо. Если оба являются ложными, то это неверный ключ.
filter_if_valid = Table.SelectRows(
Source,
(row) =>
if IslandChoice = "SI" or IslandChoice = "NI" then
row[Island] = IslandChoice
else
true
)
Как это работает, и где each
?
each
- это нормальная функция. Это sugar
, ярлык, который объявляет функцию, которая имеет один arugment. (Если вам нужно больше, используйте объявление функции)
см. больше: Подробная информация о грамматике each
находится в документе
each
неявно создает переменную с именем _
Поскольку each
абстрагирует несколько вещей, сложнее сказать, что происходит.
each
создает переменную с именем _
, которая ссылается на текущую строку . each
объявляет функцию без аргументов part
Функции имеют вид
(arguments) => return_expression
При написании each
удаляется (arguments) =>
часть.
each return_expression
return_expression
может быть простым [Column] = 10
тестом (или он может создать много локальных переменных, используя ga let
.. in
выражение внутри функции).
Все эти операторы точно равнозначны функции
each [Island] = IslandChoice
each _[Island] = IslandChoice
(_) => _[Island] = IslandChoice
(row) => row[Island] = IslandChoice
Все они
- объявить
function
без имени - принять ровно 1 аргумент
- прочитать столбец
[Island]
в строке текущей таблицы - возвращает
true
, если они равны, иначе false
оригинальный фильтр
после замены each
у вас было:
always_filter_table = Table.SelectRows(
Source,
(row) =>
row[Island] = IslandChoice
),
новый фильтр
filter_if_valid = Table.SelectRows(
Source,
(row) =>
if IslandChoice = "SI" or IslandChoice = "NI" then
row[Island] = IslandChoice
else
true
)
фильтр без жестких значений
Он будет работать без каких-либо требований. Создать новый -> blank query
let
Source = #table(
{"Island", "Point Of Connection"},
{
{"SI", "STK0331"},
{"SI", "TIM0111"},
{"NI", "ZEJ2395"},
{"NI", "XER9345"},
{"WI", "QXF9785"}
}
),
is_valid_filter = (value as any, valid_values as list) =>
List.Contains( valid_values, value ),
// use one or the other if you want all existing values to be valid
static_valid_filters = {"SI", "NI"},
dynamic_valid_filters = List.Distinct(
Source[Island]
),
IslandChoice = "NI",
// if filter is a valid value, filter using it.
// otherwise show all.
filtered_when_valid = Table.SelectRows(
Source,
(row) =>
if is_valid_filter(
IslandChoice, static_valid_filters
) then
row[Island] = IslandChoice
else
true
)
in
filtered_when_valid