Makro: sc_concat (Se um dos campos q fazem parte da concatenação estiverem nulos

(system) #1

Boa noite pessoas, estou com uma nova dúvida, a questão é sobre a sc_concat, se um dos elementos (campos) que fazem parte da concatenação estiverem em branco ou forem nulos o sistema não retorna o valor, como resolvo isso?

Por exemplo, visualizem o select abaixo, se no produto cadastrado não tiver por exemplo a descrição do material gravado, esse produto não aparece na lista para ser selecionado.

Obs.: Esse select foi colocado no lookup do campo codprd e ao selecionar o produto vai aparecer todas as informações da concatenação, ocorre se um elemento que faz parte da concatenação não estiver na tabela de origem o produto não aparece na lista para ser selecionado.

SELECT
produtos.codprd,
sc_concat(
produtos.descricao,’ ‘,
material.descricao,’ ‘,
familiaprd.descricao,’ ‘,
categoriaprd.descricao,’ - Diâm.Ext.:’,
diametro.diametro_polegada,’ - Diâm.Int.:’,
diametroint.diametro_polegada,’ - Espessura:’,
espessura.espessura_polegada)
FROM
produtos LEFT OUTER JOIN categoriaprd ON produtos.idcategoriaprd = categoriaprd.idcategoriaprd
LEFT OUTER JOIN diametro ON produtos.iddiametroext = diametro.iddiametro
LEFT OUTER JOIN diametroint ON produtos.iddiametroint = diametroint.iddiametro
LEFT OUTER JOIN espessura ON produtos.idespessura = espessura.idespessura
LEFT OUTER JOIN familiaprd ON produtos.codfamilia = familiaprd.codfam
LEFT OUTER JOIN material ON produtos.idmaterial = material.idmaterial
ORDER BY produtos.descricao

Obrigado,

DNS

(Antonio Jr.) #2

devailton, blz!?

Vc não falou se o banco é MySQL, mas se for, a função ifnull( , ) trata campo com possibilidade de retornar nulo. Se for Oracle, então a função será NVL(, ).

Abraços,
Antonio CP Júnior
27-8859-2466

(system) #3

Bom dia Antônio, obrigado pela resposta… Na verdade o banco é MySQL, não conhecia a função IFNULL, havia tendado ISNULL (MS-SQL-SERVER), mas claro… os cara tinham q mudar o nome da função… Kd o padrão do SQL? Cada sgbd tem o seu… mas deixando isso de lado… eu tentei diversas formas para fazer a concatenação, mas nenhuma funcionou, como é exatamente?

Veja abaixo as minhas tentativas:

SELECT
produtos.codprd,
sc_concat(
ifnull(produtos.descricao,’’),’ ‘,
ifnull(material.descricao,’’),’ ‘,
ifnull(familiaprd.descricao,’’),’ ‘,
ifnull(categoriaprd.descricao,’’),’ - Diâm.Ext.:’,
ifnull(diametro.diametro_polegada,’’),’ - Diâm.Int.:’,
ifnull(diametroint.diametro_polegada,’’),’ - Espessura:’,
ifnull(espessura.espessura_polegada,’’) )
FROM
produtos LEFT OUTER JOIN categoriaprd ON produtos.idcategoriaprd = categoriaprd.idcategoriaprd
LEFT OUTER JOIN diametro ON produtos.iddiametroext = diametro.iddiametro
LEFT OUTER JOIN diametroint ON produtos.iddiametroint = diametroint.iddiametro
LEFT OUTER JOIN espessura ON produtos.idespessura = espessura.idespessura
LEFT OUTER JOIN familiaprd ON produtos.codfamilia = familiaprd.codfam
LEFT OUTER JOIN material ON produtos.idmaterial = material.idmaterial
ORDER BY produtos.descricao

SELECT
produtos.codprd,
ifnull(sc_concat(
produtos.descricao,’ ‘,
material.descricao,’ ‘,
familiaprd.descricao,’ ‘,
categoriaprd.descricao,’ - Diâm.Ext.:’,
diametro.diametro_polegada,’ - Diâm.Int.:’,
diametroint.diametro_polegada,’ - Espessura:’,
espessura.espessura_polegada),’’)
FROM
produtos LEFT OUTER JOIN categoriaprd ON produtos.idcategoriaprd = categoriaprd.idcategoriaprd
LEFT OUTER JOIN diametro ON produtos.iddiametroext = diametro.iddiametro
LEFT OUTER JOIN diametroint ON produtos.iddiametroint = diametroint.iddiametro
LEFT OUTER JOIN espessura ON produtos.idespessura = espessura.idespessura
LEFT OUTER JOIN familiaprd ON produtos.codfamilia = familiaprd.codfam
LEFT OUTER JOIN material ON produtos.idmaterial = material.idmaterial
ORDER BY produtos.descricao

SELECT
produtos.codprd,
sc_concat (ifnull(produtos.descricao,’’)+’ ‘+
ifnull(material.descricao,’’)+’ ‘+
ifnull(familiaprd.descricao,’’)+’ ‘+
ifnull(categoriaprd.descricao,’’)+’ - Diâm.Ext.:’+
ifnull(diametro.diametro_polegada,’’)+’ - Diâm.Int.:’+
ifnull(diametroint.diametro_polegada,’’)+’ - Espessura:’+
ifnull(espessura.espessura_polegada,’’) )
FROM
produtos LEFT OUTER JOIN categoriaprd ON produtos.idcategoriaprd = categoriaprd.idcategoriaprd
LEFT OUTER JOIN diametro ON produtos.iddiametroext = diametro.iddiametro
LEFT OUTER JOIN diametroint ON produtos.iddiametroint = diametroint.iddiametro
LEFT OUTER JOIN espessura ON produtos.idespessura = espessura.idespessura
LEFT OUTER JOIN familiaprd ON produtos.codfamilia = familiaprd.codfam
LEFT OUTER JOIN material ON produtos.idmaterial = material.idmaterial
ORDER BY produtos.descricao

SELECT
produtos.codprd,
ifnull(produtos.descricao,’’),’ ‘,
ifnull(material.descricao,’’),’ ‘,
ifnull(familiaprd.descricao,’’),’ ‘,
ifnull(categoriaprd.descricao,’’),’ - Diâm.Ext.:’,
ifnull(diametro.diametro_polegada,’’),’ - Diâm.Int.:’,
ifnull(diametroint.diametro_polegada,’’),’ - Espessura:’,
ifnull(espessura.espessura_polegada,’’)
FROM
produtos LEFT OUTER JOIN categoriaprd ON produtos.idcategoriaprd = categoriaprd.idcategoriaprd
LEFT OUTER JOIN diametro ON produtos.iddiametroext = diametro.iddiametro
LEFT OUTER JOIN diametroint ON produtos.iddiametroint = diametroint.iddiametro
LEFT OUTER JOIN espessura ON produtos.idespessura = espessura.idespessura
LEFT OUTER JOIN familiaprd ON produtos.codfamilia = familiaprd.codfam
LEFT OUTER JOIN material ON produtos.idmaterial = material.idmaterial
ORDER BY produtos.descricao

Obrigado,

DNS

(Antonio Jr.) #4

devailton, cara!

Essa me parece a melhor construção do SQL:

SELECT produtos.codprd, sc_concat( ifnull(produtos.descricao,''),' ', ifnull(material.descricao,''),' ', ifnull(familiaprd.descricao,''),' ', ifnull(categoriaprd.descricao,''),' - Diâm.Ext.:', ifnull(diametro.diametro_polegada,''),' - Diâm.Int.:', ifnull(diametroint.diametro_polegada,''),' - Espessura:', ifnull(espessura.espessura_polegada,'') ) FROM produtos LEFT OUTER JOIN categoriaprd ON produtos.idcategoriaprd = categoriaprd.idcategoriaprd LEFT OUTER JOIN diametro ON produtos.iddiametroext = diametro.iddiametro LEFT OUTER JOIN diametroint ON produtos.iddiametroint = diametroint.iddiametro LEFT OUTER JOIN espessura ON produtos.idespessura = espessura.idespessura LEFT OUTER JOIN familiaprd ON produtos.codfamilia = familiaprd.codfam LEFT OUTER JOIN material ON produtos.idmaterial = material.idmaterial ORDER BY produtos.descricao

Eu nunca uso o sc_concat, uso o concat(valor_1, valor_2, …, valor_n) do MySQL, mas no seu SQL, a única coisa que ficou fora foi o código do produto. Como foram cercados todos os outros campos, então me leva a crer que seu LEFT OUTER JOIN gera um “produto cartesiano” e o produtos.codprd retornando Null.

Vc já fez a consulta sem concatenar os campos pra ver o resultado?

Abraços,
Antonio CP Júnior
27-8859-2466

(Tiago Kirsten) #5

Bom dia,

Não sei se você já conseguiu resolver o problema,

Aqui eu faço concatenação da seguinte maneira:

SELECT
tb_manutencao_servico.cd_ordem_servico||’ ‘||
tb_manutencao_servico.cd_equipamento||’ ‘||
tb_equipamento.cd_patrimonio||’ '||
tb_equipamento.cd_numero_serie
FROM
manutencao.tb_manutencao_servico LEFT JOIN manutencao.tb_equipamento ON tb_manutencao_servico.cd_equipamento = tb_equipamento.cd_equipamento
ORDER BY
tb_manutencao_servico.cd_ordem_servico

Uso o Postgre,

Abraço
Tiago Kirsten