Como verifico se uma coluna está vazia ou nula no MySQL?

288

Eu tenho uma coluna em uma tabela que pode conter valores nulos ou vazios. Como verifico se uma coluna está vazia ou nula nas linhas presentes em uma tabela?

(e.g. null or '' or '  ' or '      ' and ...)
priya
fonte
1
Código MySQL: select isnull(mycolumn) from mytableretorna 1 se minha coluna for nula.
Eric Leschinski 15/09/14
2
e quanto ao comprimento (trim (mycolumn))> 0?
Cyril Jacquart 14/10/2015
Para MSSQL> WHERE COLUMN <> '' OU ONDE LEN (coluna)> 0 OU ONDE NULLIF (LTRIM (RTRIM (coluna)), '') IS NOT NULL
DxTx

Respostas:

444

Isso selecionará todas as linhas em que some_colestá NULLou ''(string vazia)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
maček
fonte
7
Se você alterar a condição para WHERE some_col IS NULL OR some_col = ' '(um espaço inserido na string), ela funcionará no MySQL e no Oracle, consulte a resposta "onedaywhen". some_col = ''não funciona no Oracle, pois cadeias vazias significam NULL lá.
Johanna
1
@ Johanna, mas se você alternar para ' ', ele não funcionará no SQLite. Ele lida apenas com correspondência de seqüência idêntica / direta.
Magne
131

Conforme definido pelo SQL-92 Standard, ao comparar duas cadeias de larguras diferentes, o valor mais estreito é preenchido à direita com espaços para torná-lo com a mesma largura que o valor mais amplo. Portanto, todos os valores de cadeia que consistem inteiramente em espaços (incluindo espaços zero) serão considerados iguais, por exemplo,

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Portanto, isso deve funcionar independentemente de quantos espaços compõem o some_colvalor:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

ou mais sucintamente:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;
um dia quando
fonte
6
Obrigado por mencionar os espaços acolchoados. Você pode lucrar com eles e alterar a condição para WHERE some_col IS NULL OR some_col = ' '(um espaço inserido na string) e, em seguida, ele funciona no MySQL e no Oracle. some_col = ''não funciona no Oracle, pois cadeias vazias significam NULL e a condição completa se torna NULL.
Johanna
Minha exigência era encontrar SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; e SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;trabalhar para mim no MySQL. Espero que isso seja útil.
Dinuka Dayarathna
Na verdade, '' = ' 'funciona no SQLServer, mas não no SQLite, tanto quanto posso dizer, testando-o agora.
Magne
66

Uma maneira mais curta de escrever a condição:

WHERE some_col > ''

Desde que null > ''produz unknown, isso tem o efeito de filtrar as nullseqüências de caracteres e as vazias.

Andomar
fonte
2
Existe uma maneira de obter o inverso disso, obtendo todos os registros onde ele é NULL ou uma string vazia?
Joshua Pinter
14
@JoshPinter:coalesce(some_col, '') = ''
Andomar
6
Isso pode ter sido verdade em algum momento, mas não funciona no MySQL 14.14.
Gunnar Magnór Magnússon
funciona muito bem e é de fato a única maneira que eu poderia descobrir como filtrar ambos os campos nulos e vazios em MariaDB
Neal Davis
1
Eu uso some_col <> '' para encontrar o inverso disso
Chargnn
18

Você pode testar se uma coluna é nula ou não, usando WHERE col IS NULLou, WHERE col IS NOT NULLpor exemplo,

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

No seu exemplo, você tem várias permutações de espaço em branco. Você pode remover o espaço em branco usando TRIMe pode usar COALESCEcomo padrão um valor NULL (COALESCE retornará o primeiro valor não nulo dos valores que você fornecer.

por exemplo

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

Essa consulta final retornará linhas onde MyColé nulo ou tem qualquer tamanho de espaço em branco.

Se você puder evitá-lo, é melhor não ter uma função em uma coluna na cláusula WHERE, pois dificulta o uso de um índice. Se você simplesmente deseja verificar se uma coluna é nula ou vazia, é melhor fazer isso:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Consulte TRIM COALESCE e IS NULL para obter mais informações.

Também trabalhando com valores nulos dos documentos do MySQL

Code Magician
fonte
2
Você apresenta a solução real de uma maneira muito complicada. Primeiro, você apresenta uma solução incompleta para o problema "onde mycol é nulo". Em seguida, você apresenta uma solução usando duas funções aninhadas na cláusula where, mesmo dizendo que isso deve ser evitado. Só então você chega à solução real. No futuro, apresente sua solução real primeiro.
Faltando )antes do =sinal no seu segundo exemplo
Rorrim
15

Outro método sem ONDE, tente isso ..

Selecionará os valores Vazio e NULL

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
PodTech.io
fonte
isso retorna 1 se houver algo nulo, por que isso acontece?
Noobie-php
o NULLIF verifica o nome do campo quanto ao valor vazio e seria convertido em NULL se estivesse vazio. O ISNULL retorna 1 (verdadeiro) se o NULLIF alterou com êxito um campo vazio para NULL ou se já era NULL .... tente você mesmo em um campo nulo e vazio em uma tabela com as duas funções separadas, selecione isnull (X) , selecione null (y)
PodTech.io
9

Ou

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

ou

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename
Reynante Daitol
fonte
6

Eu odeio campos confusos em meus bancos de dados. Se a coluna puder ser uma sequência em branco ou nula, prefiro corrigir isso antes de fazer a seleção a cada vez, assim:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Isso mantém os dados organizados, desde que você não precise diferenciar especificamente entre NULL e vazio por algum motivo.

Keith Johnson
fonte
5

experimentar

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

ou

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Referência

diEcho
fonte
5

Esta declaração é muito mais limpa e mais legível para mim:

select * from my_table where ISNULL(NULLIF(some_col, ''));
Amaynut
fonte
4

Ao verificar o null or Emptyvalor de uma coluna no meu projeto, notei que há alguma preocupação 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 no SQL é usada para remover o prefixo ou sufixo especificado de uma sequência. O padrão mais comum sendo removido são os espaços em branco. Essa função é chamada de maneira diferente em bancos de dados diferentes:

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

Como verificar vazio / nulo: -

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

A sintaxe para essas funções de apara são:

  1. Use o Trim para verificar

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. O uso de LTRIM e RTRIM para verificar

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

Acima, os dois modos fornecem o mesmo resultado, basta usar com base no seu suporte ao DataBase. Ele apenas retorna a tabela FirstNamefrom UserDetailsse ela estiver vaziaLastName

Esperando que isso ajude você :)

Vikash Pandey
fonte
3

Se você deseja que os valores NULL sejam apresentados por último ao executar um ORDER BY, tente o seguinte:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
Homem fantasma
fonte
3

Você também pode fazer

SELECT * FROM table WHERE column_name LIKE ''

O ser inverso

SELECT * FROM table WHERE column_name NOT LIKE ''
brenjt
fonte
Aparentemente, não funciona: select NULL like ''retorna NULL- pelo menos no MySQL.
Titus
2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
Baltazar Moreno
fonte
Eu tive um problema ao comparar com um campo que às vezes era nulo. Isso ajudou:col1 != IFNULL(col2,'')
webaholik
1

Verificar nulo

$column is null
isnull($column)

Verifique se há vazio

$column != ""

No entanto, você deve sempre definir NOT NULL para a coluna, a
otimização do mysql pode manipular apenas um nível IS NULL

ajreal
fonte
3
Nunca aceitar NULLvalores é outro tópico para discussão. Não acho apropriado fazer essa recomendação sem fornecer seu raciocínio.
Maček
Eu incluí, seja paciente. Além disso, é realmente dificultar a vida usando NULL (assim como esta pergunta).
ajreal
5
Essa é uma péssima recomendação. A configuração de NOT NULL em uma coluna cujo valor pode não ser conhecido no momento do INSERT serve apenas para incentivar o uso de valores "nulos" não padrão como -1e ''.
22814 Dan Bechard
@ Dan, se você não tiver certeza de qual é o valor durante a inserção, pode ter dificuldades para realizar qualquer otimização possível
ajreal
0
select * from table where length(RTRIM(LTRIM(column_name))) > 0
Hakan Ilgar
fonte
1
Qual é o sentido de usar ambos RTRIMe LTRIM, mas não TRIM?
Nico Haase
0

No meu caso, o espaço foi inserido na coluna durante a importação de dados e, embora parecesse uma coluna vazia, seu comprimento era 1. Então, antes de tudo, verifiquei o comprimento da coluna de aparência vazia usando length(column)então, com base nisso, podemos escrever uma consulta de pesquisa

SELECT * FROM TABELA ONDE COMPRIMENTO (COLUNA) = comprimento da coluna para a coluna vazia

SENHOR E
fonte
-1

tente isso se o tipo de dados for string e a linha for nula

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

se o tipo de dados for int ou column for 0, tente isso

SELECT * FROM table WHERE column_name > = 0
Monis Qureshi
fonte
-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
SaAy
fonte
1
Resposta errada. Isso não será selecionado NULL.
Pang