MySQL CONCAT retorna NULL se algum campo contiver NULL


162

Tenho os seguintes dados na minha tabela "dispositivos"

affiliate_name  affiliate_location  model     ip             os_type    os_version 

cs1             inter               Dell     10.125.103.25   Linux      Fedora  
cs2             inter               Dell     10.125.103.26   Linux      Fedora  
cs3             inter               Dell     10.125.103.27   NULL       NULL    
cs4             inter               Dell     10.125.103.28   NULL       NULL    

Eu executei a consulta abaixo

SELECT CONCAT(`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) AS device_name
FROM devices

Retorna o resultado dado abaixo

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
(NULL)
(NULL)

Como sair disso para que ele ignore NULL E o resultado seja

cs1-Dell-10.125.103.25-Linux-Fedora
cs2-Dell-10.125.103.26-Linux-Fedora
cs3-Dell-10.125.103.27-
cs4-Dell-10.125.103.28-

Respostas:


278

converta os NULLvalores com uma cadeia vazia envolvendo-aCOALESCE

SELECT CONCAT(COALESCE(`affiliate_name`,''),'-',COALESCE(`model`,''),'-',COALESCE(`ip`,''),'-',COALESCE(`os_type`,''),'-',COALESCE(`os_version`,'')) AS device_name
FROM devices

1
Você pode usar se selecione CONCAT (if (affiliate_name é nulo, '', affiliate_name), '-', se (modelo é nulo, '', affiliate_name)) como modelo a partir de dispositivos
Dinesh Rabara

6
Para aqueles que se perguntam, como eu fiz, o que a COALESCEfunção faz: ela retorna o primeiro NULLparâmetro sem valor passado a ela (ou NULLse todos os parâmetros estiverem NULL). Ao passar uma string vazia como o segundo parâmetro, você garante que ela não retornará NULL.
Jo.

3
mysql tem IFNULL (arg, padrão) em vez COALESCE com a mesma sintaxe
Vasilii Suricov

126

Use CONCAT_WS :

CONCAT_WS () não pula seqüências de caracteres vazias. No entanto, ignora qualquer valor NULL após o argumento separador.

SELECT CONCAT_WS('-',`affiliate_name`,`model`,`ip`,`os_type`,`os_version`) AS device_name FROM devices

Desculpe neeraj i perdeu o '_' entre Concat e WS favor tente novamente com CONCAT_WS () Eu atualizei a resposta por favor verifique,.
Gurmeet

8
Observe que esta solução oculta uma "coluna" completa (incluindo o separador) se um dos campos do meio for NULL. Portanto, esta resposta está correta apenas assumindo que apenas os últimos campos podem ser NULL. Dependendo da sua necessidade, a resposta COALEASE () abaixo pode ser melhor.
Janes

Isso funciona apenas se você desejar que cada membro seja separado pelo mesmo separador. O CONCAT não tem essa limitação. Eu publiquei a solução como resposta aqui
patrick

12

Para ter a mesma flexibilidade em CONCAT_WS e em CONCAT (se você não quiser o mesmo separador entre todos os membros, por exemplo), use o seguinte:

SELECT CONCAT_WS("",affiliate_name,':',model,'-',ip,... etc)

11
SELECT CONCAT(isnull(`affiliate_name`,''),'-',isnull(`model`,''),'-',isnull(`ip`,''),'-',isnull(`os_type`,''),'-',isnull(`os_version`,'')) AS device_name
FROM devices

15
no mysql IFNULL () em vez de ISNULL ()
Jeffrey Nicholson Carré

10

CONCAT_WSainda produz nulo para mim se o primeiro campo for nulo. Eu resolvi isso adicionando uma string de comprimento zero no início, como em

CONCAT_WS("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`)

Contudo

CONCAT("",`affiliate_name`,'-',`model`,'-',`ip`,'-',`os_type`,'-',`os_version`) 

produz Nulo quando o primeiro campo é Nulo.


obviamente, porque o primeiro campo é a string que irá concatenar com (WS = com string)
Bouke Versteegh

2
CONCAT_WS é a abreviação de Concatenate With Separator. O primeiro parâmetro é o separador e não pode ser nulo. Provavelmente, é isso que você deseja:CONCAT_WS("-", affiliate_name, model, ip, os_type, os_version)
encrest

2

você pode usar se declaração como abaixo

select CONCAT(if(affiliate_name is null ,'',affiliate_name),'- ',if(model is null ,'',affiliate_name)) as model from devices
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.