Declaração do problema
Estou usando o Power Query no Excel para Microsoft 365.
Encontrei casos em que a aplicação de um filtro de texto a uma coluna corresponde a valores nulos . Isso resulta na remoção indesejada de linhas. Encontrei uma solução alternativa para isso, mas estou tentando entender por que esse comportamento ocorre ou se é um bug.
A captura de tela abaixo mostra meus dados não filtrados e o resultado da aplicação deste filtro M Language:
= Table.SelectRows(#"Changed Type", each not Text.EndsWith([Column 2], "foo"))
Ao substituir valores nulos no predicado do filtro, obtemos:
not Text.EndsWith(null, "foo")
not false
true
Portanto, a linha "tamanduá" deve ser mantida (já que o valor dessa linha para "Coluna 2" não termina em "foo"), mas a linha é descartada .
Gambiarra
Suponha que eu altere o filtro da seguinte maneira:
= Table.SelectRows(#"Changed Type", each not Text.EndsWith([Column 2], "foo") Or [Column 2] = null)
Neste caso, obtemos:
Este é o resultado desejado.
Minha pergunta
Por que as linhas com um valor nulo na "Coluna 2" estão sendo filtradas pelo meu primeiro filtro? Ou isso é um bug?
Editar para adicionar demonstração da resposta selecionada
A resposta de Ron Rosenfeld foi bastante instrutiva. Achei que deveria acrescentar uma demonstração do que ele sugeriu. Tentei entender o comportamento. Ao adicionar colunas personalizadas como Ron sugere, aqui está o resultado:
Este é um comportamento documentado (embora bem escondido) em relação ao comportamento
null
em comparações.Você pode vê-lo se adicionar uma coluna personalizada à sua tabela original com a fórmula:
Você notará que isso retorna
null
se você incluir ou não o arquivonot
.E como
Table.SelectRows
retorna apenas as linhas avaliadas comoTrue
, não retornará a linha que contém umnull
E sua solução alternativa é o que você precisa fazer, embora você possa encurtá-la usando o
coalesce
operador assim:O
??
funciona avaliando o lado esquerdo, a menos que seja nulo, caso em que avalia o lado direito.