Qual é a melhor maneira de verificar se o valor é nulo ou vazio nas instruções sql do Postgres?
O valor pode ser uma expressão longa, portanto é preferível que ele seja gravado apenas uma vez em cheque.
Atualmente estou usando:
coalesce( trim(stringexpression),'')=''
Mas parece um pouco feio.
stringexpression
pode ser char(n)
coluna ou expressão contendo char(n)
colunas com espaços à direita.
Qual é a melhor maneira?
char
é quase sempre a escolha errada devido ao preenchimento (e ao desperdício de espaço resultante). Mas além disso: não acho que exista uma solução melhor.Respostas:
A expressão
stringexpression = ''
produz:TRUE
.. for''
(ou para qualquer sequência que consiste apenas em espaços com o tipo de dadoschar(n)
)NULL
.. forNULL
FALSE
.. para qualquer outra coisaPortanto, para verificar: "
stringexpression
é NULL ou vazio" :Ou a abordagem inversa (pode ser mais fácil de ler):
Funciona para qualquer tipo de personagem, incluindo
char(n)
. O manual sobre operadores de comparação.Ou use sua expressão original sem
trim()
, que é um ruído dispendioso parachar(n)
(veja abaixo) ou incorreta para outros tipos de caracteres: cadeias que consistem em apenas espaços passariam como cadeias vazias.Mas as expressões no topo são mais rápidas.
Afirmar o contrário é ainda mais simples: "
stringexpression
não é NULL nem vazio" :Sobre
char(n)
Isto é sobre o tipo de dados
char(n)
, abreviação de:character(n)
. (char
/character
é a abreviação dechar(1)
/character(1)
.) Seu uso é desencorajado no Postgres :Não confundir
char(n)
com tipos de outro, útil, carátervarchar(n)
,varchar
,text
ou"char"
(com aspas).Em
char(n)
uma cadeia vazia não é diferente de qualquer outra cadeia que consiste apenas em espaços. Todos esses itens são dobrados em n espaços,char(n)
por definição do tipo. Segue-se logicamente que as expressões acima funcionamchar(n)
também - exatamente como essas (que não funcionariam para outros tipos de caracteres):Demo
Cadeia vazia é igual a qualquer cadeia de espaços quando convertida para
char(n)
:Resultado:
Teste para "cadeia nula ou vazia" com
char(n)
:Resultado:
Teste para "cadeia nula ou vazia" com
text
:Resultado:
db <> mexe aqui
Old sqlfiddle
Palavras-chave:
fonte
best way to check if value is null or empty string
. Atrim()
ligação é (comparativamente) cara - e simplesmente não é necessária. Eu adicionei mais sobrechar(n)
e "string vazia".''
. Posso remover a guarnição e usarcoalesce(stringexpression,'')=''
para verificar. Isso me parece mais legível em comparação com a sua resposta.select coalesce(' ', '') = ''
retorna falso. Então TRIM () é necessáriacoalesce(' '::char(5), '') = ''
não. Em qualquer caso, eu usaria uma das duas principais expressões, que funcionam para qualquer tipo de caractere e são mais rápidas e limpas.Para verificar nulos e vazios:
Para verificar nulos, vazios e espaços (apare a sequência)
fonte
A verificação do comprimento da string também funciona e é compacta:
fonte
where length(stringexpression) = 0;
. Isso funciona para mim.Se houver espaços vazios vazios, provavelmente não há solução melhor.
COALESCE
é apenas para problemas como o seu.fonte
Algo que eu vi pessoas usando é
stringexpression > ''
. Pode não ser o mais rápido, mas é um dos mais curtos.Tentei no MS SQL, bem como no PostgreSQL.
fonte
outra maneira é
fonte
Minha maneira preferida de comparar campos anuláveis é: NULLIF (nullablefield,: ParameterValue) É NULL AND NULLIF (: ParameterValue, nullablefield) É NULL. Isso é complicado, mas é de uso universal, enquanto Coalesce é impossível em alguns casos.
O segundo e inverso uso de NULLIF é porque "NULLIF (campo nulo:: ParameterValue) É NULL" sempre retornará "true" se o primeiro parâmetro for nulo.
fonte
Se o banco de dados tiver um grande número de registros,
null check
pode levar mais tempo, você pode usar a verificação nula de diferentes maneiras, como: 1)where columnname is null
2)where not exists()
3)WHERE (case when columnname is null then true end)
fonte
Muitas das respostas são a maneira mais curta, não necessariamente a melhor, se a coluna tiver muitos valores nulos. A interrupção das verificações permite que o otimizador avalie a verificação mais rapidamente, pois não precisa trabalhar na outra condição.
A comparação de cadeias não precisa ser avaliada, pois a primeira condição é falsa.
fonte