A maioria dos principais RDBMSs suporta o
COALESCE()
operador, que retorna o primeiro valor não nulo de sua lista de argumentos. COALESCE()
é um recurso padrão SQL (está incluído na especificação ISO/IEC 9075). Sintaxe
A sintaxe fica assim:
COALESCE (V1, V2, ..., Vn)
Portanto, pelo menos um argumento é necessário, mas vários argumentos podem ser (e geralmente são) fornecidos.
COALESCE()
é considerado um n -operador ádico. Em outras palavras, é um operador que possui um número variável de operandos (ou seja, n operandos). Exemplo
Aqui está um exemplo simples para demonstrar:
SELECT COALESCE(null, 'Papaya', 'Salad');
Resultado:
Papaya
Neste caso,
Papaya
foi o primeiro valor não nulo, então COALESCE()
retornou esse valor. Salad
também era um valor não nulo, mas veio depois de Papaya
e por isso não foi devolvido. COALESCE()
vs CASE
COALESCE()
é normalmente considerado um atalho sintático para o CASE
expressão. Assim, a seguinte afirmação:
COALESCE (V1, V2)
é equivalente a:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END
E a seguinte declaração:
COALESCE (V1, V2, ..., Vn)
(para n ≥ 3) É equivalente a:
CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END
Quando todos os valores são nulos
Se todos os valores forem
null
, COALESCE()
retorna null
:SELECT COALESCE( null, null );
Resultado:
null
Dependendo do seu RDBMS, a saída real para valores nulos pode ser diferente. Por exemplo, ao usar psql (para PostgreSQL), a string vazia é gerada por padrão sempre que um valor nulo é retornado (embora isso possa ser alterado). É o mesmo com o SQLite (e isso também pode ser alterado).
No SQL Server, se todos os argumentos forem
null
, então pelo menos um dos valores nulos deve ser um null
digitado . Portanto, o exemplo acima na verdade resulta em um erro (porque todos os argumentos nulos são null
constantes). Expressões
COALESCE()
retorna o valor atual da primeira expressão que inicialmente não é avaliada como null
. Portanto, se passarmos uma expressão como esta:SELECT COALESCE( null, 3 * 5 );
Obtemos isso:
15
Exemplo de banco de dados
Suponha que executemos a seguinte consulta:
SELECT
name,
salary
FROM employee;
E obtemos o seguinte resultado:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | null
Podemos ver que a última linha tem um valor nulo no
DOB
coluna. Se quiséssemos substituir o valor nulo por outro valor, poderíamos usar
COALESCE()
do seguinte modo:SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Resultado:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Neste caso, substituímos todos os valores nulos pelo inteiro
0
. Diferenças entre RDBMSs
Em geral,
COALESCE()
funciona praticamente da mesma forma nos RDBMSs. Mas existem algumas diferenças.
Tipos de dados
Podemos fazer o seguinte no MySQL, MariaDB e SQLite:
SELECT
name,
COALESCE(salary, 'None') AS salary
FROM employee;
Resultado:
name salary ----- ------ Elise 100000 Rohit 50000 Homer None
Nesse caso, sempre que o
salary
coluna contém um valor nulo, a saída é None
. Mas essa consulta pode causar problemas no SQL Server, PostgreSQL ou Oracle Database.
Quando executo essa consulta no SQL Server, PostgreSQL e Oracle Database, recebo um erro devido ao valor substituto ser o tipo de dados incorreto.
Aqui está o que o SQL Server retorna quando executo a consulta acima:
Msg 245, Level 16, State 1, Line 15 Conversion failed when converting the varchar value 'None' to data type int.
Aqui está o que o PostgreSQL retorna:
ERROR: invalid input syntax for type integer: "None" LINE 3: COALESCE(salary, 'None') AS salary ^
E aqui está o que o Oracle Database retorna:
ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
Mas se eu usar um valor numérico, não recebo o erro:
SELECT
name,
COALESCE(salary, 0) AS salary
FROM employee;
Resultado:
name | salary -------+-------- Elise | 100000 Rohit | 50000 Homer | 0
Portanto, este exemplo final funciona em todos os seis RDBMSs acima.
Argumentos nulos
Outra diferença entre como os RDBMSs processam
COALESCE()
está em como eles lidam com argumentos nulos. Como mencionado, no SQL Server, se todos os argumentos forem
null
, pelo menos um dos valores nulos deve ser um null
digitado . Em outras palavras, se todos os argumentos para COALESCE()
são a constante nula, então obtemos um erro. Este não é o caso de outros RDBMSs, onde todos os argumentos podem ser a constante nula e a saída será null
em vez de um erro.