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?
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,
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.
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 ISNULL
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.
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:
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.
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
SELECTIF(field1 ISNULLor field1 ='','empty', field1)as field1 from tablename
ou
SELECTcasewhen field1 ISNULLor field1 =''then'empty'else field1endas field1 from tablename
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=NULLWHERE MyColumn='';SELECT*FROM MyTable WHERE MyColumn ISNULL
Isso mantém os dados organizados, desde que você não precise diferenciar especificamente entre NULL e vazio por algum motivo.
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:
Use o Trim para verificar
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
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
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
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
select isnull(mycolumn) from mytable
retorna 1 se minha coluna for nula.Respostas:
Isso selecionará todas as linhas em que
some_col
estáNULL
ou''
(string vazia)fonte
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á.' '
, ele não funcionará no SQLite. Ele lida apenas com correspondência de seqüência idêntica / direta.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,
Portanto, isso deve funcionar independentemente de quantos espaços compõem o
some_col
valor:ou mais sucintamente:
fonte
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.SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' ';
eSELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;
trabalhar para mim no MySQL. Espero que isso seja útil.'' = ' '
funciona no SQLServer, mas não no SQLite, tanto quanto posso dizer, testando-o agora.Uma maneira mais curta de escrever a condição:
Desde que
null > ''
produzunknown
, isso tem o efeito de filtrar asnull
seqüências de caracteres e as vazias.fonte
coalesce(some_col, '') = ''
Você pode testar se uma coluna é nula ou não, usando
WHERE col IS NULL
ou,WHERE col IS NOT NULL
por exemplo,No seu exemplo, você tem várias permutações de espaço em branco. Você pode remover o espaço em branco usando
TRIM
e pode usarCOALESCE
como padrão um valor NULL (COALESCE retornará o primeiro valor não nulo dos valores que você fornecer.por exemplo
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:
Consulte TRIM COALESCE e IS NULL para obter mais informações.
Também trabalhando com valores nulos dos documentos do MySQL
fonte
)
antes do=
sinal no seu segundo exemploOutro método sem ONDE, tente isso ..
Selecionará os valores Vazio e NULL
fonte
Ou
ou
fonte
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:
Isso mantém os dados organizados, desde que você não precise diferenciar especificamente entre NULL e vazio por algum motivo.
fonte
experimentar
ou
Referência
fonte
Esta declaração é muito mais limpa e mais legível para mim:
fonte
Ao verificar o
null or Empty
valor 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:
TRIM(), RTRIM(), LTRIM()
RTRIM(), LTRIM()
RTRIM(), LTRIM()
Como verificar vazio / nulo: -
A sintaxe para essas funções de apara são:
Use o Trim para verificar
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
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
FirstName
fromUserDetails
se ela estiver vaziaLastName
Esperando que isso ajude você :)
fonte
Se você deseja que os valores NULL sejam apresentados por último ao executar um ORDER BY, tente o seguinte:
fonte
Você também pode fazer
O ser inverso
fonte
select NULL like ''
retornaNULL
- pelo menos no MySQL.fonte
col1 != IFNULL(col2,'')
Verificar nulo
Verifique se há vazio
No entanto, você deve sempre definir NOT NULL para a coluna, a
otimização do mysql pode manipular apenas um nível IS NULL
fonte
NULL
valores é outro tópico para discussão. Não acho apropriado fazer essa recomendação sem fornecer seu raciocínio.-1
e''
.fonte
RTRIM
eLTRIM
, mas nãoTRIM
?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 pesquisafonte
tente isso se o tipo de dados for string e a linha for nula
se o tipo de dados for int ou column for 0, tente isso
fonte
fonte
NULL
.