Regras que valem para todos os operadores M

M

1. Precedência

Da maior para a menor. No mesmo nível, da esquerda para a direita.

OrdemCategoriaOperadores
1Primáriox[campo], x{i}, x(...), ( ), { }, [ ], @, ...
2Unário+x, -x, not x
3Metadadosmeta
4Multiplicativo*, /
5Aditivo+, -, &
6Relacional<, >, <=, >=
7Igualdade=, <>
8Afirmação de tipoas
9Teste de tipois
10E lógicoand
11OU lógicoor
12Coalescência??
M
1 + 2 * 3      // 7
(1 + 2) * 3    // 9

2. Sem conversão implícita

Diferente do DAX e do Excel, o M não converte tipos nos operadores:

M
1 + "2"               // erro
"Lote " & 5           // erro
"Lote " & Text.From(5)   // "Lote 5"
1 = "1"               // false (tipos diferentes nunca são iguais)
true = 1              // false

Converta explicitamente com Number.From, Text.From, Date.From e similares, ou defina o tipo da coluna antes da conta.

3. null nas contas e nas comparações

M
6 * null           // null
"Lote " & null     // null
null = null        // true
null < 1           // null (não false!)
[Desconto] ?? 0    // troca null por 0

Uma coluna com null contamina a conta inteira: trate com ?? ou com Substituir valores antes de calcular.

Atenção Table.SelectRows(Vendas, each [Valor] > 100) descarta as linhas com [Valor] nulo, porque null > 100 é null, não true.

and e or com null (linha = lado esquerdo, coluna = lado direito):

andtruefalsenull
truetruefalsenull
falsefalsefalsefalse
nullnullfalsenull
ortruefalsenull
truetruetruetrue
falsetruefalsenull
nulltruenullnull

and e or só aceitam lógico ou null; qualquer outro tipo dá erro.

3.1 Comparações de texto e de estruturas

M
"a" = "A"                              // false: diferencia maiúsculas
"B" < "a"                              // true: ordem ordinal, sem cultura
Text.Lower([Nome]) = "ana"             // compare sem diferenciar maiúsculas
[A = 1, B = 2] = [B = 2, A = 1]        // true: ordem dos campos não importa
{1, 2} = {2, 1}                        // false: ordem dos itens importa
#nan = #nan                            // false

<, >, <= e >= exigem os dois lados do mesmo tipo; comparar número com texto dá erro.

4. Precisão

Os operadores + - * / usam precisão Double (ponto flutuante). Para precisão decimal de 128 bits, use as funções com Precision.Decimal:

M
Value.Add([Valor], [Frete], Precision.Decimal)
Value.Multiply([Qtd], [Preço], Precision.Decimal)

Divisão por zero não dá erro: 1 / 0 devolve #infinity e 0 / 0 devolve #nan.

5. Contas com data e hora

ContaResultado
data/hora + duraçãodata/hora deslocada
data/hora − duraçãodata/hora deslocada para trás
data/hora − data/horaduração entre as duas
duração + duraçãoduração
duração Não númeroduração multiplicada
duração ÷ númerofração da duração
data & horadata/hora combinada
M
#date(2026, 12, 31) - #date(2026, 1, 1)             // #duration(364, 0, 0, 0)
Duration.Days(#date(2026, 12, 31) - #date(2026, 1, 1))   // 364
#date(2026, 9, 24) & #time(14, 30, 0)               // #datetime(2026, 9, 24, 14, 30, 0)

6. & em listas e registros

M
{1} & {2, 3}             // {1, 2, 3}
[a = 1] & [b = 2]        // [a = 1, b = 2]
[x = 1, y = 2] & [x = 3]  // [x = 3, y = 2]: o campo da direita vence

Tabelas também se concatenam com &: as colunas que só existem de um lado vêm com null do outro.

7. Buscar uma linha pela chave

M
Clientes{[Código = 42]}           // a linha inteira, como registro
Clientes{[Código = 42]}[Nome]     // só o nome
Clientes{[Código = 99]}?          // null se não existir

Se mais de uma linha tiver o valor, dá erro — mesmo com ?.

Fontes

Conhecer a trilha Power BI ao vivo