Сравнение значений null в Power Query
Недавно мне нужно было сделать очень простую операцию в Power Query. В столбце с числами нужно было выполнить проверку “значение меньше N” и в новом столбце вывести соответствующий текст. Функция дополнительного столбца выглядит примерно так:
1 |
= if [Values] < 5 then "A" else "B" |
На самом деле некоторые значения – null (то есть пустые):
И такая простая операция возвращает ошибку для этих значений!
Почему? Есть некоторая ловушка, спрятанная в глубинах документации (а именно на странице 67 PDF-файла “Power Query Formula Language Specification (October 2016)”, который можно найти тут.
Если коротко, то вот краткая выжимка из документации:
Значения null можно сравнивать на равенство, но null равен только null:
1 2 3 4 5 |
null = null // true null = 5 // false null = true // false null = false // false null <> "a" // true |
Но если вы хотите сравнить null с любым другим значением при помощи относительного оператора (например, <, >, <=, >=), тогда результат сравнения будет не логическое значение типа true или false, а именно null. В разделе “6.7 Relational operators” об этом есть маленькое замечание:
If either or both operands are null , the result is the null value.
Так и в чем уловка? В выражении if…then…else после слова if должно идти логическое значение (например, как результат какого-то сравнения):
1 |
if logical_value then do_this else do_that |
Когда мы сравниваем (практически любые) значения одного типа, мы в результате получаем логическое значение: true или false . Но в случае с null мы получим логическое значение только в случае, если мы сравниваем null на равенство:
1 |
null = SomeValue // true o false |
НО если мы сделаем относительное сравнение null с SomeValue, тогда результат – НЕ логическое значение (он будет null), и выражение if…then…else вернет ошибку:
1 2 3 |
if null > 0 // null, и 'if null' возвращает error: null не является logical then do_this else do_that // всё вычисление также вернет error |
Как избавиться от этой ошибки, если ваши данные содержат null и замена его на другое значение не подходит вам по каким-либо причинам?
Из сказанного выше очевидно, что мы должны проверить значение на равенство с null, и только если оно не равно null – выполнить относительное сравнение.
Нужно построить корректное выражение сравнения, добавив проверку на null на первое место. В моем случае должно получиться такое выражение:
1 2 3 4 5 6 |
if [Values] = null then "C" else if [Values] < 5 then "A" else "B" |
Убедитесь, что вы сначала проверяете значения на равенство с null ! Выражение if…then…else выполняет последовательное вычисление условий, и если первым условием будет идти относительное сравнение, ошибка снова появится и наследуется до конца расчета выражения:
1 2 3 4 5 6 |
if [Values] < 5 then // здесь ошибка по-прежнему появляется и передается далее then "A" else if [Values] = null then "C" else "B" |
Follow me:
Share this: