[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