Estou com um problema em que, quando tento selecionar as linhas que possuem um NULL para uma determinada coluna, ele retorna um conjunto vazio. No entanto, quando olho para a tabela no phpMyAdmin, ele diz nulo para a maioria das linhas.
Minha consulta é mais ou menos assim:
SELECT pid FROM planets WHERE userid = NULL
Conjunto vazio toda vez.
Muitos locais disseram para garantir que não sejam armazenados como "NULL" ou "null" em vez de um valor real, e um disse para tentar procurar apenas um espaço ( userid = ' '
), mas nenhum deles funcionou. Houve uma sugestão para não usar o MyISAM e o innoDB porque o MyISAM tem problemas para armazenar nulos. Mudei a tabela para o innoDB, mas agora sinto que o problema pode ser que ele ainda não é nulo devido à maneira como pode convertê-lo. Eu gostaria de fazer isso sem ter que recriar a tabela como innoDB ou qualquer outra coisa, mas se for necessário, certamente posso tentar isso.
Respostas:
O SQL NULL é especial, e você precisa fazer
WHERE field IS NULL
, pois NULL não pode ser igual a nada,incluindo a si próprio (ou seja: NULL = NULL é sempre falso).Veja
Rule 3
https://en.wikipedia.org/wiki/Codd%27s_12_rulesfonte
select * from foo where bar <> "abc"
se não retornar linhas onde bar é nulo. Isso me jogou para dar uma volta hoje. Os documentos chamam<>
o operador "não é igual a", mas na verdade é o "é igual a algo diferente de" operador.fonte
Como todas as respostas são dadas, quero acrescentar um pouco mais. Eu também havia enfrentado o mesmo problema.
Por que sua consulta falhou? Você tem,
Isso não fornecerá o resultado esperado, porque no mysql doc
Ênfase minha.
Solução
Para testar
NULL
, use oIS NULL
eIS NOT NULL
operadores.NULL
.NULL
.fonte
Há também um
<=>
operador:Trabalharia. O bom é que
<=>
também pode ser usado com valores não NULL:SELECT NULL <=> NULL
rendimentos1
.SELECT 42 <=> 42
rendimentos1
também.Veja aqui: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
fonte
Informações de http://w3schools.com/sql/sql_null_values.asp :
Portanto, no caso de seu problema:
fonte
Teve o mesmo problema em que consulta:
não retornou valores. Parece ser um problema com o MyISAM e a mesma consulta nos dados no InnoDB retornou os resultados esperados.
Foi com:
Retornou todos os resultados esperados.
fonte
fonte
Eu tive o mesmo problema ao converter bancos de dados do Access para MySQL (usando vb.net para se comunicar com o banco de dados).
Eu precisava avaliar se um campo (tipo de campo varchar (1)) era nulo.
Esta declaração funcionou para o meu cenário:
fonte