Como verificar os valores nulos / vazios / espaços em branco com um único teste?


88

Eu gostaria de escrever uma instrução SELECT que usa apenas um teste para retornar colunas sem valor (nulo, vazio ou todos os espaços).

Achei que isso funcionaria:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

Mas isso não funciona para valores NULL.

Claro que posso adicionar

OR column_name IS NULL

e vai funcionar, mas gostaria de uma forma que usasse um único teste.



Não é desejável ter vários testes? ou seja, mais granularidade = melhor feedback aos usuários sobre como corrigir os dados.
dia em

@onedaywhen: Em geral, pode ser melhor ter mais granularidade, mas estou trabalhando com uma base de código existente e quero imitar a estrutura de código existente o máximo possível. O código atual faz apenas um teste, então eu estava procurando uma solução que também tivesse apenas um teste.
John Gordon

Respostas:


99

Funcionalmente, você deve ser capaz de usar

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

O problema é que um índice em COLUMN_NAME não seria usado. Você precisaria ter um índice baseado em função em TRIM (column_name) se essa for uma condição seletiva.


32
Observação para usuários de T-SQL: não há TRIM, você precisará de LTRIM ou RTRIM.
demoncodemonkey

11
Desde o SQL Server 2017, existe uma função TRIM. Fonte
bvwidt

1
@ EhMann365 esta questão é sobre Oracle, não Sql Server.
MH

11
RTRIM (LTRIM (column_name)) - Para usuários Microsft SQL.
DxTx

4
No Sql Server TRIM (nome_da_coluna) retorna string vazia '', não NULL. Outras respostas suportam string vazia e NULL
Michael Freidgeim

25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') retornará '' se nome_da_coluna for NULL, caso contrário, ele retornará nome_da_coluna.

ATUALIZAR

No Oracle, você pode usar NVLpara obter os mesmos resultados.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
na verdade, isso ainda não funciona no Oracle, o Oracle trata strings vazias como NULL, então você não pode ter uma cláusula de "não gosto ''", pois está comparando com um valor nulo
Harrison

Eu não iria querer LIKE '' em vez de NOT LIKE ''?
John Gordon

Sim, desculpe, interpretou mal a pergunta original como se quisesse tudo que tem valor. Mas, como tanging apontou, não parece que isso funcionará no Oracle.
GendoIkari

Como estou usando o Oracle, parece que posso usar WHERE TRIM (col) IS NULL e isso cuidará dos valores nulos, em branco e de espaço em branco.
John Gordon

Obviamente, a primeira parte está faltando um parêntese, deveria ser:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

14

A função NULLIF converterá qualquer valor de coluna com apenas espaços em branco em um valor NULL. Funciona para T-SQL e SQL Server 2008 e superior.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

1
Uma boa resposta conteria uma explicação do código e por que ele foi escrito dessa forma. Recomendo que você atualize sua resposta :-)
Qirel

1
Qual é o objetivo disso? Seria mais eficiente apenas defini-lo como [column_name] LIKE ''
SILENT

Ele precisa de TRIM para oferecer suporte a vários espaços em branco
Michael Freidgeim

1
Testando no SQL Server 2017, isso funciona para vários espaços em branco sem TRIM. Não faz sentido para mim, porque de acordo com a documentação, NULLIF deve retornar NULL apenas se as duas expressões forem iguais, e uma string de espaços geralmente não é igual a uma string vazia. (Eu só testei para espaços, não tabs, novas linhas ou outros caracteres de espaço em branco.)
Jovie

1
@Jovie SQL Server às vezes ignora espaços em branco à direita, leia: stackoverflow.com/questions/17876478/…
Brian MacKay

7

Ao verificar o null or Emptyvalor de uma coluna, percebi que existem algumas preocupações de suporte em vários bancos de dados.

Todo banco de dados não suporta TRIM método.

Abaixo está a matriz apenas para entender os métodos suportados por diferentes bancos de dados.

A função TRIM em SQL é usada para remover o prefixo ou sufixo especificado de uma string. O padrão mais comum sendo removido são os espaços em branco. Esta função é chamada de forma diferente em diferentes bancos de dados:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oráculo: RTRIM(), LTRIM()
  • Servidor SQL: TRIM(), RTRIM(), LTRIM()

Como verificar espaços vazios / nulos / em branco: -

Abaixo estão duas maneiras diferentes de acordo com diferentes bancos de dados-

A sintaxe para essas funções de corte é:

  1. Uso de Trim para verificar

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Uso de LTRIM e RTRIM para verificar

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Acima, ambas as formas fornecem o mesmo resultado, apenas use com base no seu suporte de banco de dados. Ele apenas retorna a FirstNamepartir de UserDetailsmesa se tiver um vazioLastName

Espero que isso ajude outras pessoas também :)


COM t como (selecione '' c union all selecione '' c union all selecione NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; não retornou 3 registros no servidor SQL
Waqar

5
Por que tanto L e RTRIM são necessários? Não bastaria apenas uma das funções para verificar se a coluna está vazia?
SILENT

4

Esta consulta phpMyAdmin está retornando essas linhas, que NÃO são nulas ou vazias ou apenas espaços em branco:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

se você deseja selecionar linhas que são nulas / vazias / apenas espaços em branco, apenas remova NOT.


2

Use a consulta abaixo e funciona

SELECT column_name FROM table_name where isnull(column_name,'') <> ''

0

O que eu uso IsNotNullOrEmptyOrWhiteSpaceno T-SQL é:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0

0

Cada sugestão de uma pessoa para executar uma consulta no Oracle para encontrar registros cujo campo específico está apenas em branco (isso não está incluindo (nulo) ou qualquer outro campo apenas uma linha em branco) não funcionou. Tentei todos os códigos sugeridos. Acho que vou continuar pesquisando online.

*****ATUALIZAR*****

Tentei fazer isso e funcionou, não sei por que não funcionaria se <1, mas por algum motivo <2 funcionou e só retornou registros cujo campo está apenas em branco

selecione [columnName] de [tableName] onde LENGTH (columnName) <2;

Estou supondo que qualquer script que foi usado para converter dados deixou algo no campo, embora apareça em branco, esse é o meu palpite de qualquer maneira sobre por que <2 funciona, mas não <1

No entanto, se você tiver quaisquer outros valores nesse campo de coluna com menos de dois caracteres, talvez seja necessário encontrar outra solução. Se não houver muitos outros personagens, você pode selecioná-los.

Espero que minha solução ajude outra pessoa algum dia.


-3

Como no Oracle, você pode usar a função NVL no MySQL, você pode usar IFNULL (columnaName, newValue) para obter o resultado desejado como neste exemplo

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

-4

você pode usar

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.