Сравнение значений null в Power Query

Недавно мне нужно было сделать очень простую операцию в Power Query. В столбце с числами нужно было выполнить проверку “значение меньше N” и в новом столбце вывести соответствующий текст. Функция дополнительного столбца выглядит примерно так:

= if [Values] < 5 then "A" else "B"

На самом деле некоторые значения – null (то есть пустые):

Данные содержат null и в результате сравнения возникает ошибка

И такая простая операция возвращает ошибку для этих значений!

Почему? Есть некоторая ловушка, спрятанная в глубинах документации (а именно на странице 67 PDF-файла  “Power Query Formula Language Specification (October 2016)”, который можно найти тут.

Если коротко, то вот краткая выжимка из документации:

Значения  null  можно сравнивать на равенство, но null равен только null:

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 должно идти логическое значение (например, как результат какого-то сравнения):

if logical_value then do_this else do_that

Когда мы сравниваем (практически любые) значения одного типа, мы в результате получаем логическое значение: true  или false . Но  в случае с  null  мы получим логическое значение только в случае, если мы сравниваем null на равенство:

null = SomeValue // true o false

НО если мы сделаем относительное сравнение null с SomeValue, тогда результат – НЕ логическое значение (он будет null), и выражение if…then…else вернет ошибку:

if null > 0 // null, и 'if null' возвращает error: null не является logical
then do_this
else do_that // всё вычисление также вернет error

Как избавиться от этой ошибки, если ваши данные содержат null и замена его на другое значение не подходит вам по каким-либо причинам?

Из сказанного выше очевидно, что мы должны проверить значение на равенство с null, и только если оно не равно null – выполнить относительное сравнение.

Нужно построить корректное выражение сравнения, добавив проверку на null на первое место. В моем случае должно получиться такое выражение:

if [Values] = null
then "C"
else 
    if [Values] < 5 
    then "A" 
    else "B"

Убедитесь, что вы сначала проверяете значения на равенство с null ! Выражение if…then…else выполняет последовательное вычисление условий, и если первым условием будет идти относительное сравнение, ошибка снова появится и наследуется до конца расчета выражения:

if [Values] < 5 then // здесь ошибка по-прежнему появляется и передается далее
then "A"
else 
    if [Values] = null 
    then "C" 
    else "B"

Сначала проверяйте на равенство null, иначе ошибка опять появится

 

Follow me: Facebooktwitterlinkedinmail
Share this: Facebooktwitterredditpinterestlinkedinmail
Share this
Номер недели ISO в Power Query / M и Power BI
Абсолютные и относительные ссылки в Power Query – подход в стиле Excel