[RESOLVIDO] Campo SELECT composto por 3 colunas retorna linha em branco se há coluna não preenchida

Senhores, Bom Dia! Prezo muito quem puder ajudar neste problema e peço desculpas se já consta no fórum, mas eu procurei e não achei nada.

Problema: Tenho um campo do tipo SELECT em formulário único registro, que está baseado em uma tabela cujo dado a ser retornado para o usuário é composto por 3 colunas, sendo que uma delas não é campo obrigatório e pode ser vazia. Quando isso acontece a linha retornada no SELECT é toda nula.

Exemplificando:
CREATE TABLE TS_NATUREZA
( ID INT NOT NULL PRIMARY KEY,
COD_CFOP VARCHAR(4) NOT NULL,
SUFIXO VARCHAR(3),
DESCRICAO VARCHAR(80) );
INSERT INTO TS_NATUREZA (ID,COD_CFOP,SUFIXO,DESCRICAO) VALUES (1,‘1102’,‘1’,‘NATUREZA 1102 - 1’);
INSERT INTO TS_NATUREZA (ID,COD_CFOP,SUFIXO,DESCRICAO) VALUES (2,‘1102’,‘2’,‘NATUREZA 1102 - 2’);
INSERT INTO TS_NATUREZA (ID,COD_CFOP,SUFIXO,DESCRICAO) VALUES (3,‘1102’,NULL,‘NATUREZA 1102 - 3’);

Composição do campo SELECT:
SELECT ID, sc_concat(COD_CFOP, ‘-’, SUFIXO, ‘-’, DESCRICAO)
FROM TS_NATUREZA
ORDER BY COD_CFOP, ‘-’, SUFIXO, ‘-’, DESCRICAO

No caso, é a terceira linha que vem toda em branco.

Desde já, obrigada!

usa apenas o CONCAT

SELECT ID, CONCAT(COD_CFOP, ‘-’, SUFIXO, ‘-’, DESCRICAO)
FROM TS_NATUREZA

e tira esse order by, tenta rodar primeiro esse select no banco, vê oq retorna.

Prezado Lucas,
Muito obrigada por sua ajuda.
No MySql funciona perfeitamente como esperado;
No Scriptcase continuo obtendo uma linha em branco;
No Oracle a função CONCAT tem apenas dois parâmetros e eu preciso que aplicação seja multi-banco;
Mais alguma idéia? rs

Liga o modo debug para ver se está dando algum erro…

Outra opção seria você montar uma view e consumir ela …

Mas eu testei o concat aqui e está trazendo os valores.

@lucasmatsumoto, liguei no debug e não apresenta erro não.
Sim, o concat no MySql funciona, somente no scriptcase que não está.

concatenação no oracle:

SELECT first_name || ' ' || last_name AS Nome FROM employees

@InfinitusWeb Ah sim, obrigada, mas o meu problema é outro.
Eu preciso que o resultado da concatenação seja interpretado pelos diferentes bancos de dados, então eu não poderia usar um recurso específico nem do Oracle, nem outro somente do MySql.
Só não entendo porque acontece isso realmente e é super importante que eu consiga resolver.
Mais alguma dica?

a macro sc_concat é para isso.

vc pode criar uma função nos bancos para fazer o concat conforme cada banco.

1 Curtida

o if… is null não funcionaria?
ex:

SELECT ID, concat(COD_CFOP, '-', if(SUFIXO is null ,'',SUFIXO), '-', DESCRICAO) as Pesq 
FROM TS_NATUREZA 
ORDER BY COD_CFOP, '-', if(SUFIXO is null ,'',SUFIXO), '-', DESCRICAO
1 Curtida

@InfinitusWeb

a macro sc_concat é para isso.
>> Sim, era para isso mesmo. Só não funciona como desejo na situação indicada.

vc pode criar uma função nos bancos para fazer o concat conforme cada banco.
>> Certo. Estava evitando fazer dessa forma.

@jair, funcionaria no MySql sim, mas no Oracle não.
Grata pela ajuda :wink:

Verifique se essa coluna que você diz não preenchido está como null, se ela estiver como null o resultado do SC concat vai ser vazio mesmo

1 Curtida

Você precisa colocar um If dentro do SC concate para testar se a coluna é null se for null resultar em branco

1 Curtida

Pode usar a função coelesce para testar o null e subistituir

SELECT COALESCE(campoquepodeternull, 0);

1 Curtida

@InfinitusWeb, muito obrigada! O problema é que o IF funcionaria no MySql, mas no Oracle não…

@Fmorais, testei o uso da função COALESCE tanto no banco MySql, quanto no Oracle e funcionou sim, mas o resultado com o sc_concat() ainda não foi satisfatório (continua apresentando a linha em branco) :frowning:
Já trocando de sc_concat() para concat() funciona no MySql mas no Oracle não…
Mesmo assim, muito obrigada!

2 Curtidas

Copie o código do sql que esta usando aqui.

No Oracle quanto em qualquer banco o IS NULL funciona.

@InfinitusWeb, claro! Segue abaixo:
SELECT ID, sc_concat(COD_CFOP, ‘-’, COALESCE(SUFIXO,’’), ‘-’, DESCRICAO)
FROM TS_NATUREZA

consegue apresentar o debug tanto no mysql quanto no oracle?

IF no Oracle funciona sim, assim como CASE WHEN.

Quando eu quis dizer IF, foi no sentido de testar o valor da coluna com Null.

1 Curtida

Olá Haroldo, @InfinitusWeb,
Ah sim entendi. Eu costumo usar o CASE WHEN mesmo (confesso que o IF como instrução no SELECT não - só em PL/SQL), mas nem o CASE WHEN, nem COALESCE funcionam quando estão dentro da sc_concat().

Veja o debug no MySql (retorna apenas o conteúdo do 1o campo o restante é ignorado):
(pdo-mysql): SELECT ID, COD_CFOP, ‘-’, COALESCE(SUFIXO,’’, ‘-’, DESCRICAO) as sc_alias_0 FROM TS_NATUREZA ORDER BY 2

Veja o debug no Oracle (ocorre erro - perceba que houve perda de informação do select):
(pdo-oci): SUFIXO||’’||’-’||DESCRICAO as sc_alias_0 FROM TS_NATUREZA ORDER BY 2
ADOConnection._Execute(SUFIXO||’’||’-’||DESCRICAO as sc_alias_0 FROM TS_NATUREZA ORDER BY 2, false) % line 1151, file: adodb.inc.php
ADOConnection.Execute(SUFIXO||’’||’-’||DESCRICAO as sc_alias_0 FROM TS_NATUREZA ORDER BY 2) % line 2927, file: control_TS_NATUREZA_apl.php
control_TS_NATUREZA_apl.Form_lookup_select_natureza() % line 754, file: control_TS_NATUREZA_form0.php
include_once(/home/erpgesta/public_html/scriptcase9/app/FinpacWeb/control_TS_NATUREZA/control_TS_NATUREZA_form0.php) % line 2507, file: control_TS_NATUREZA_apl.php
control_TS_NATUREZA_apl.nm_gera_html() % line 1165, file: control_TS_NATUREZA_apl.php

Pelo que eu entendi, alguma coisa a mais a macro sc_concat faz e as funções que quero usar simplesmente não funcionam (pq sem ela conectada aos bancos, funciona).

Porém, eu testei uma alternativa aqui e funcionou, fiz um select dentro do outro tratando o campo que desejo:
SELECT ID, CONCAT(COD_CFOP,’-’,SUFIXO,’-’,DESCRICAO)
FROM (
SELECT ID, COD_CFOP, NVL(SUFIXO,‘X’) AS SUFIXO, DESCRICAO
FROM TS_NATUREZA ) TS_NATUREZA
Funcionaria com o NVL, o CASE WHEN, o COALESCE… todos… mas confesso que achei bem solução de contorno mesmo.

3 Curtidas