Qual é o equivalente do PostgreSQL para ISNULL ()

255

No MS SQL-Server, eu posso fazer:

SELECT ISNULL(Field,'Empty') from Table

Mas no PostgreSQL eu recebo um erro de sintaxe. Como eu emulo a ISNULL()funcionalidade?

Byron Whitlock
fonte
1
Não, você não pode fazer isso no MSSQL. Esse código não será compilado. ISNULLrecebe dois argumentos e retorna o segundo é o primeiro null, caso contrário, o primeiro.
GSerg 6/02/10
@GSerg, você está certo. consertou isso.
Byron Whitlock
Gserg e Byron sim, você pode ver aqui Exemplo do meu PC SELECT isnull (a.FechaEntregada, '') como teste do dbo.Amonestacion a msdn.microsoft.com/en-us/library/ms184325.aspx
Juan

Respostas:

453
SELECT CASE WHEN field IS NULL THEN 'Empty' ELSE field END AS field_alias

Ou mais idiomático:

SELECT coalesce(field, 'Empty') AS field_alias
Kyle Butt
fonte
49
+1 para coalesce. (PS Você pode fazer isso em MS SQL Server, também.)
Alison R.
2
Existem outros casos para usar IS NULL, por isso é bom conhecer os dois.
Kyle Butt
30
Eu acho que vale a pena notar que é isso coalesceque está no padrão SQL, por isnullser uma função específica do MS que é essencialmente coalescecom apenas dois parâmetros.
GSerg 6/02/10
4
Coalesce () também lida com a promoção de tipos corretamente (exatamente como UNION SELECT), enquanto IsNull () não.
ErikE
2
Vale ressaltar que ISNULL e COALESCE não são os mesmos. IsNull força o tipo de resultado ao tipo de argumento1, enquanto a coalescência usa os respectivos tipos para cada argumento. Se você acabou de procurar e substituir isnull com coalesce, você pode, potencialmente, ter um monte de erros ...
Stefan Steiger
76

Use em COALESCE()vez disso:

SELECT COALESCE(Field,'Empty') from Table;

Funciona muito parecido com ISNULL, embora ofereça mais funcionalidade. A coalescência retornará o primeiro valor não nulo da lista. Portanto:

SELECT COALESCE(null, null, 5); 

retorna 5, enquanto

SELECT COALESCE(null, 2, 5);

retorna 2

Coalesce terá um grande número de argumentos. Não há um máximo documentado. Eu testei com 100 argumentos e conseguiu. Isso deve ser suficiente para a grande maioria das situações.

Jim Clouse
fonte
24

Como emulo a funcionalidade ISNULL ()?

SELECT (Field IS NULL) FROM ...
Artur
fonte
4
Este emula a funcionalidade exata do isnull, não tenho certeza por isso que é downvoted
smackshow
A melhor resposta para a pergunta, é claro. Esta expressão é o equivalente completo de ISNULL (). COALESCE () é muito inteligente e interessante, mas não pode executar um ISNULL () enquanto estiver fechado.
precisa saber é o seguinte
17
Não sei ao que os ISNULLcomentaristas estão se referindo, mas field IS NULLfornece um valor booleano, enquanto ISNULLno SQL Server funciona da seguinte maneira COALESCE: retorna um dos não NULLvalores. Esta resposta está terrivelmente errada. Consulte a documentação: ISNULL.
Jpmc26
10
Eu suspeito que esses comentaristas são usuários do MySQL que não perceberam que a pergunta começa com "No MS SQL Server, ..." O MySQL tem uma função ISNULL () que usa um único argumento e retorna 0 ou 1. A versão do T-SQL leva dois argumentos e se comporta como COALESCE ou NVL da Oracle.
David Noha
1
greatvovan, Se essa foi a intenção do pôster original, acredito que o que as pessoas estão querendo é a resposta para "Como verifico se um campo é nulo", não necessariamente "Como exatamente a função ISNULL funciona". Esse foi o meu caso e esta resposta é perfeita para isso.
Freeman Helmuth
15

Experimentar:

SELECT COALESCE(NULLIF(field, ''), another_field) FROM table_name
user2718914
fonte
3
Isso é bom, pois abrange o caso em que um campo de texto NÃO é nulo, mas também 'vazio'.
soulia
-9

Crie a seguinte função

CREATE OR REPLACE FUNCTION isnull(text, text) RETURNS text AS 'SELECT (CASE (SELECT $1 "
    "is null) WHEN true THEN $2 ELSE $1 END) AS RESULT' LANGUAGE 'sql'

E vai funcionar.

Você pode criar versões diferentes com diferentes tipos de parâmetros.


fonte
28
Por favor, ninguém faça isso. Use coalesce () para que seu DBA não o odeie.
Jordânia
1
postgres, por favor, adicione isnull para que ninguém odeie ninguém.
Eric Twilegar