[firebase-br] Utilizar variável Varchar em IN

Gladiston Santana gladiston em vidy.com.br
Qui Jan 16 14:01:27 -03 2020


Se no seu tipo de problema, itiposmov for uma lista formatada assim
'1,4,233,255,' você pode usar dessa forma:
where ( (:itiposmov = '') or (contaning(cast(M.TIPOMOV as
VARCHAR(8) )||',', :itiposmov)
Como o Cantu sugeriu, apenas tome cuidado com o separador de números, ele
tem que fazer parte da expressão para evitar erro de confundir 23 ou 33 com
233.
A dica resolve seu problema, mas se você tem um índice para esse campo
numérico, eu quebraria a cabeça mais um pouquinho e enfiaria-o num laço
while e executaria a query tantas vezes quanto houvesse numeros desde que o
operador 'containing' pudesse ser trocado por '='. Ex:
  -- Loop enquanto houver virgulas na string,  l_nextpos seguirá arfando
para a próxima vírgula enquanto existir...
  l_lastpos = 1;
  l_nextpos = position(',', :itiposmov , l_lastpos);
  while (:l_nextpos > 1) do
  begin
    str = trim(substring(:itiposmov from :l_lastpos for :l_nextpos -
:l_lastpos));
    if (:str <> '') then
    begin
       l_numero=: cast( :str as integer)
       if exists(select  1  from CONTAS_MOV M where M.TIPOMOV=: l_numero)
then
       begin
         select  M.ID <http://m.id/>, M.DESCRICAO  from CONTAS_MOV M where
M.TIPOMOV=: l_numero
         into :oid, odescricao;
         suspend;
      end
    end
    l_lastpos = :l_nextpos + 1;
    l_nextpos = position(',', :source_list, l_lastpos);
  end
O loop acima se concentra em processar um numero por vez. Apesar de mais
linhas, provavelmente mais performatico.

Em qua., 15 de jan. de 2020 às 23:11, Carlos Andrade <krlosgilson em gmail.com>
escreveu:

> Olá! Seria possível utilizar uma variável do tipo varchar com "IN"
> dentro de uma cláusula "where"?
>
> Por ex:
>
> create or alter procedure SP_CONTAS_MOV (
> itiposmov varchar (50)
> ) returns (
> oid integer,
> odescricao varchar(50))
> as
> begin
>    for
>      select M.ID, M.DESCRICAO
>      from CONTAS_MOV M
>      where ( (:itiposmov = '') or (M.TIPOMOV in (:itiposmov)) ) -- Aqui
> como ficaria?
>      into :oid, odescricao
>      do suspend;
> end
>
> o campo "M.TIPOMOV" é do tipo Integer. Desta forma está dando erro de
> conversão de string.
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas:
> http://www.firebase.com.br/pesquisa_lista.html
>


-- 
A Vidy possui um Sistema de Gestão da Qualidade estruturado e com
Certificação ISO 9001 há mais de 10 anos, mantendo seu foco na Qualidade e
na Melhoria Continua.

Em março de2018 migramos com sucesso para a nova versão da ISO 9001.

Somos a única Empresa Brasileira de Engenharia de Laboratórios com
certificação com o Escopo Completo; desde Projetos, Engenharia, Construção,
Fabricação e Instalação de Laboratórios.



Mais detalhes sobre a lista de discussão lista