Cláusula IN em Campo String

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
huntersc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 12 Mar 2010 3:11 pm
Localização: FLORIANOPOLIS - SC

Boa Tarde,
Estou com um problema..

tenho Uma tabela de negociação onde tenho um campo string
onde coloco os representantes (1,2,3,4)
Preciso que o select retorne os mesmos dados para cada representante..
utilizando in só esta funcionando quando tenho 1 representante.

Selecionar tudo

SELECT
       CAST((case when ven.codvend is null then 0 else ven.codvend end) AS varchar(20)) cdRepresentante,
       tpv.codtipvenda cdCondicaoPagamento,
       tpv.descrtipvenda dsCondicaoPagamento,
       FROM negociacao tpv     
       left join vendedores ven on ven.codvend in tpv.ad_represen
Como poderia fazer isso? e quando não tem vendedor mandar 0 para a linha..

O que eu acho estranho é se eu troco o campo tpv.ad_represen que esta na clausula in por um valor fixo (1,2,3) funciona...

Agradeço a ajuda..
Valeu

Jr
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

O que você está tentando implementar é conhecido por dynamic IN-list.

O Tom Kyte abordou o tema algumas vezes em seu site AskTom e no blog dele.

Uma forma de implementar que funciona desde o Oracle 8i e até o 11g, é usando um cast para um nested table type parseando sua string.

Exemplo dado pelo Tom:

Selecionar tudo

ops$tkyte@8i> create or replace type myTableType as table of number;
  2  /
Type created.

ops$tkyte@8i> create or replace function str2tbl( p_str in varchar2 ) return myTableType
  2  as
  3      l_str   long default p_str || ',';
  4      l_n        number;
  5      l_data    myTableType := myTabletype();
  6  begin
  7      loop
  8          l_n := instr( l_str, ',' );
  9          exit when (nvl(l_n,0) = 0);
 10          l_data.extend;
 11          l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
 12          l_str := substr( l_str, l_n+1 );
 13      end loop;
 14      return l_data;
 15  end;
 16  /

Function created.

ops$tkyte@8i> 
ops$tkyte@8i> select * from all_users
  2  where user_id in ( select *
  3    from THE ( select cast( str2tbl( '1, 3, 5, 7, 99' ) as mytableType ) from dual ) )
  4  /

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SYSTEM                                  5 20-APR-99

Verifique no link abaixo:
http://asktom.oracle.com/pls/asktom/f?p ... 0612348061
huntersc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 12 Mar 2010 3:11 pm
Localização: FLORIANOPOLIS - SC

Isso Mesmo..

Funcionou;

Show de bola :-o

Obrigado
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante