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

Carlos Andrade krlosgilson em gmail.com
Sex Jan 17 13:25:29 -03 2020


Ah, Sim! Perfeito. Gladiston, muito obrigado pela ajuda! A entrada 
"itiposmov" está formatada desta forma que você mencionou. A minha 
aplicação envia os ID's dos tipos de movimentos (Dinheiro, Cheque, 
Cartão, Permuta etc) que o usuário selecionar. Deu tudo certo aqui, mais 
uma vez obrigado a todos!


> 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.




Mais detalhes sobre a lista de discussão lista