É possível fazer uma instrução select que use apenas valores NOT NULL?
Agora eu estou usando isso:
Agora, quando eu seleciono * eu recebo val1, val2, val3, nulo, val4, val5, nulo, nulo etc .... mas eu só quero obter os valores que não são nulos no meu resultado. Isso é possível sem filtrar com um loop?
— bryan sammon
O que você deseja que aconteça se houver uma linha em que algumas colunas tenham valores NULL e outras não tenham valores NULL?
Gostaria de obter apenas os valores das colunas que não são nulos e retornar apenas os valores da coluna na linha que não são nulos. No momento, eu uso um loop para filtrá-los, é possível fazer isso sem um loop?
— Bryan sammon # 12/11
@ bryan - Qual é a sua estrutura de tabelas? Todas as colunas têm o mesmo tipo de dados?
@ bryan - Então, como seria o seu conjunto de resultados ideal? Um conjunto de resultados de uma coluna contendo todos os valores não nulos? Se não editar a sua pergunta com exemplos de dados e resultados desejados seria útil ...
@bryan - Parece que sua tabela pode ter grupos repetidos em colunas? (Veja o artigo Wiki para uma explicação e uma estrutura alternativa sugerida, se for esse o caso en.wikipedia.org/wiki/First_normal_form )
Você deveria usar IS NOT NULL. (Os operadores de comparação =e os <>dois fornecem UNKNOWNcom NULLambos os lados da expressão.)
Apenas para completar, mencionarei que no MySQL você também pode negar o operador de igualdade segura nula, mas esse não é o SQL padrão.
Editado para refletir os comentários. Parece que sua tabela pode não estar na primeira forma normal; nesse caso, alterar a estrutura pode facilitar sua tarefa. Algumas outras maneiras de fazer isso ...
A desvantagem do acima é que ela varre a tabela várias vezes uma vez para cada coluna. Isso pode ser evitado pelo abaixo, mas eu não testei isso no MySQL.
Muito obrigado .. Ele ajudou :)
— DfrDkn
Na última abordagem, você usou a CASEinstrução, não a CASEfunção. Então não deveria ser END CASE, em vez de END na SELECT CASE ...parte?
— Istiaque Ahmed
Para pessoas não tão especializadas, você pode explicar a última solução? O idx rom o primeiro SELECTvem do idxno segundo SELECT? O que a CASEdeclaração tenta realizar? O que o segundo SELECTrealmente faz? E você está fazendo uma junção interna, não uma junção cruzada, certo?
Eu não acho que isso responda à pergunta. Parecia que o OP queria selecionar (presumo uma específica) linha, mas excluir todas as colunas desse resultado que eram nulas - essa resposta requer que você especifique quais colunas não podem ser nulas (que é um problema completamente diferente) ou especificar todas as colunas, inadequados para tabelas com muitas colunas
— csey
(por exemplo, algo ao longo das linhas de SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
Você pode filtrar as linhas que contêm um valor NULL em uma coluna específica:
Se você deseja filtrar as linhas que contêm um nulo em qualquer coluna, tente o seguinte:
E eu concordo com Martin que se você precisar fazer isso, provavelmente deverá alterar o design do banco de dados.
Não sei se expliquei bem o suficiente, mas vou tentar um pouco melhor. Agora, quando eu seleciono * eu recebo val1, val2, val3, nulo, val4, val5, nulo, nulo etc .... mas eu só quero obter os valores que não são nulos no meu resultado. Isso é possível sem filtrar com um loop?
— Bryan sammon 12/03/11
@ bryan - Você poderia explicar quais colunas *retornam? Talvez forneça alguns exemplos de dados na sua pergunta, pois não está claro no seu comentário acima se esta é apenas uma coluna.
No momento, * retorna todos os meus valores na linha. ou seja, val1, val2, val3, nulo, val4, val5, nulo, nulo. Mas eu quero que ele retorne apenas os valores da coluna que não são nulos. No momento, faço isso com um loop para filtrar os valores após o retorno do resultado.
A única desvantagem dessa abordagem é que você pode comparar apenas cinco colunas; depois disso, o resultado sempre será falso; portanto, comparo apenas os campos que podem ser NULL.
— Alan Chavez
— porquero
GROUP_CONCAT (body) AS body
— Ravindra Singh
Eu uso o \!comando no MySQL para receber valores NULL do shell:
Funciona melhor com um local apropriado .my.cnfonde seu banco de dados / nome de usuário / senha são especificados. Dessa forma, você só precisa cercar o seu selectcom \! mysql ee | grep -v NULL.