[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