No MySQL, posso selecionar colunas apenas onde algo existe?
Por exemplo, eu tenho a seguinte consulta:
select phone, phone2
from jewishyellow.users
where phone like '813%'
and phone2
Estou tentando selecionar apenas as linhas em que o telefone começa com 813 e o phone2 tem algo.
phone2
tem algo nele"? As pessoas estão tomando suposições quanto a saber se você quer dizerphone2
não é nulo, não estiver em branco, se não exclusivamente espaços em branco, etc.Respostas:
Compare o valor de
phone2
com uma sequência vazia:Observe que o
NULL
valor é interpretado comofalse
.fonte
phone2<>""
não deixará passar nenhum verificador de sintaxe SQL.Para verificar se o campo é NULL
IS NULL
, useIS NOT NULL
operadores.Referência do MySql http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html
fonte
Verifique
NULL
e esvazie os valores das strings:NB: Acho que COALESCE () é o padrão SQL (-ish), enquanto ISNULL () não é.
fonte
Uma resposta que eu tenho usado e que está funcionando muito bem para mim que eu ainda não vi aqui (essa pergunta é muito antiga, então pode não ter funcionado) é realmente
Observe o
> ''
parte, que verificará se o valor não é nulo e se o valor não é apenas espaço em branco ou em branco.Basicamente, se o campo tiver algo diferente de espaço em branco ou
NULL
, é verdade. Também é super curto, por isso é fácil de escrever, e outra vantagem sobreCOALESCE()
eIFNULL()
funções é que isso é amigável ao índice, pois você não está comparando a saída de uma função em um campo a nada.Casos de teste:
ATUALIZAÇÃO Há uma ressalva que eu não esperava, mas os valores numéricos iguais ou inferiores a zero não são maiores que uma string em branco; portanto, se você estiver lidando com números que podem ser zero ou negativos, NÃO FAÇA ISSO , me mordeu muito recentemente e foi muito difícil depurar :(
Se você estiver usando strings (char, varchar, texto etc.), tudo ficará perfeitamente bem, mas tenha cuidado com os números.
fonte
Se houver espaços no campo phone2 a partir da entrada de dados inadvertida, você poderá ignorar esses registros com as funções IFNULL e TRIM:
fonte
fonte
NULL
valor e uma string vazia''
que é um valor. Se você deseja verificar uma sequência vazia, usecolumn <> ''
como sugerido pelas outras respostas.Pode precisar de alguns ajustes, dependendo do seu valor padrão. Se você permitiu o preenchimento Nulo, pode fazer "Não NULL", o que é obviamente melhor.
fonte
NOT()
função no MySQL 2)phone2=""
não passará por nenhum verificador de sintaxe SQL.Podemos usar CASE para definir o valor em branco para algum caractere ou String. Estou usando NA como string padrão.
fonte
Outra alternativa é examinar especificamente
CHAR_LENGTH
os valores da coluna. (para não confundirLENGTH
)O uso de critérios em que o tamanho do caractere seja maior que 0 evitará falsos positivos quando os valores da coluna puderem ser falsos, como no caso de uma coluna inteira com um valor de
0
ouNULL
. Comportando-se de forma mais consistente em diferentes tipos de dados.O que resulta em qualquer valor que tenha pelo menos 1 caractere ou não esteja vazio.
Exemplo https://www.db-fiddle.com/f/iQvEhY1SH6wfruAvnmWdj5/1
Dados da tabela
CHAR_LENGTH(phone2) > 0
Resultados (o mesmo)Alternativas
phone2 <> ''
Resultados (diferentes)phone2 > ''
Resultados (diferentes)COALESCE(phone2, '') <> ''
Resultados (o mesmo)Nota: os resultados diferem dos
phone2 IS NOT NULL AND phone2 <> ''
que não são esperadosphone2 IS NOT NULL AND phone2 <> ''
Resultados (diferentes)fonte
Surpreendentemente (como ninguém mencionou antes), constatou que a condição abaixo faz o trabalho:
quando precisamos excluir valores nulos e vazios. Alguém está ciente das desvantagens da abordagem?
fonte
Usar:
fonte
IS NOT NULL
não é aplicado a cadeias apenas de colunas com valores vazios (''
). Não sei por que, mas só queria salientar. É mais sábio usart.phone2 <> ''
ao procurar colunas de string vazias.você pode usar como curinga do operador para conseguir isso:
Dessa forma, você pode obter todos os telefones2 que tenham um prefixo de número.
fonte
No meu caso, eu tinha uma coluna varchar, ambos os métodos de
IS NOT NULL
&!= ''
não funcionaram , mas o seguinte funcionou para mim. Apenas colocando isso aqui.fonte