SELECT COM ATRIBUTO IN EM CAMPOS INTEIROS E PARAMETROS VARCHAR
Galera estou tentando fazer um select com parametros no firebird 2.5 com o atributo IN. Só tem um problema meu parâmetro tem que ser varchar, mas o campo no qual vou utilizar o IN é inteiro.
O campo ped.tipo_id é inteiro, mas preciso pesquisar mais de um tipo de venda. exemplo: Tipo 1 = 1, tipo 2 = 2, etc... O select ficaria IN(1,2), só que os valores 1,2 vem dentro paramento :tipo, e da erro de tipo de dados, ja tentei o CAST também não tive sucesso.
Alguém já utilizou esse atributo assim? Podem me ajudar?
O campo ped.tipo_id é inteiro, mas preciso pesquisar mais de um tipo de venda. exemplo: Tipo 1 = 1, tipo 2 = 2, etc... O select ficaria IN(1,2), só que os valores 1,2 vem dentro paramento :tipo, e da erro de tipo de dados, ja tentei o CAST também não tive sucesso.
Alguém já utilizou esse atributo assim? Podem me ajudar?
SELECT COALESCE(Sum(ped.total1),0)
FROM pedidos ped
WHERE ped.tipo_id < 5
AND ped.loj_id = :loja
AND ped.status = :status
AND ped.tipo_id in( :tipo )
AND Cast(ped.data_emissao AS DATE) BETWEEN :dt_ini AND :dt_fim
Sidney Abreu
Curtidas 0
Melhor post
Marcos P
17/03/2015
A ideia é simples, embora a sintaxe possa não ser...
1. Declare uma variável varchar para receber o comando sql que será executado
2. Carregue a variável com a parte fixa no código
3. Complemente o código com os parâmetros necessários, SEMPRE tratando-os como string
4. Execute o comando, através da variável declarada, via EXECUTE STATEMENT
Vou fazer a sintaxe para o sql server, que me é mais familiar.
Você pode adaptá-la ao Firebird.
Senão rolar, me avise, que eu tento aqui em um server Firebird...
Repare que no código acima eu assumi :
> :loja e :status como inteiro... mas convertidos para varchar, pois eles devem ser concatenados à string do comando
> :tipo... já como varchar delimitado, ou seja, vai ser passada uma string tipo '1,2,3'
> :dt_ini e :dt_fim, já como string delimitado
Para os seguintes parâmetros...
> :loja ( int ) : 5
> status ( int ) : 3
> :tipo ( varchar ) : '1,2,3'
> :dt_ini ( varchar ) : '2015-01-01'
> :dt_fim ( varchar ) : '2015-01-31'
Você ficará com @sql igual a :
SELECT COALESCE(Sum(ped.total1),0)
FROM pedidos ped
WHERE ped.tipo_id < 5
AND ped.loj_id = 5
AND ped.status = 3
AND ped.tipo_id in( '1,2,3')
AND Cast(ped.data_emissao AS DATE) BETWEEN '2015-01-01' AND '2015-01-31'
Resolvendo seu problema de transformar a passagem dos parâmetros char como uma sequencia de inteiros.
Atenção aos delimitadores das strings ( ' ' ) !!!
Espero não ter complicado muito...
1. Declare uma variável varchar para receber o comando sql que será executado
2. Carregue a variável com a parte fixa no código
3. Complemente o código com os parâmetros necessários, SEMPRE tratando-os como string
4. Execute o comando, através da variável declarada, via EXECUTE STATEMENT
Vou fazer a sintaxe para o sql server, que me é mais familiar.
Você pode adaptá-la ao Firebird.
Senão rolar, me avise, que eu tento aqui em um server Firebird...
DECLARE @sql varchar(1000) set @sql = 'SELECT COALESCE(Sum(ped.total1),0) FROM pedidos ped WHERE ped.tipo_id < 5 AND ped.loj_id = ' + Cast(:loja as VARCHAR(5)) + 'AND ped.status = ' + Cast(:status as VARCHAR(5)) + 'AND ped.tipo_id in( ' +.:tipo ')'+ 'AND Cast(ped.data_emissao AS DATE) BETWEEN ' +:dt_ini+ ' AND ' + ':dt_fim' execute statement (@sql)
Repare que no código acima eu assumi :
> :loja e :status como inteiro... mas convertidos para varchar, pois eles devem ser concatenados à string do comando
> :tipo... já como varchar delimitado, ou seja, vai ser passada uma string tipo '1,2,3'
> :dt_ini e :dt_fim, já como string delimitado
Para os seguintes parâmetros...
> :loja ( int ) : 5
> status ( int ) : 3
> :tipo ( varchar ) : '1,2,3'
> :dt_ini ( varchar ) : '2015-01-01'
> :dt_fim ( varchar ) : '2015-01-31'
Você ficará com @sql igual a :
SELECT COALESCE(Sum(ped.total1),0)
FROM pedidos ped
WHERE ped.tipo_id < 5
AND ped.loj_id = 5
AND ped.status = 3
AND ped.tipo_id in( '1,2,3')
AND Cast(ped.data_emissao AS DATE) BETWEEN '2015-01-01' AND '2015-01-31'
Resolvendo seu problema de transformar a passagem dos parâmetros char como uma sequencia de inteiros.
Atenção aos delimitadores das strings ( ' ' ) !!!
Espero não ter complicado muito...
GOSTEI 2
Mais Respostas
Marcos P
17/03/2015
Sidney,
Você deve trabalhar com query dinâmica, gerando o comando em uma variável varchar ( ou text ), concatenando os parâmetros como string e executando o comando como EXECUTE STATEMENT...
Esse link, pode ajudar : EXECUTE STATEMENT
Você deve trabalhar com query dinâmica, gerando o comando em uma variável varchar ( ou text ), concatenando os parâmetros como string e executando o comando como EXECUTE STATEMENT...
Esse link, pode ajudar : EXECUTE STATEMENT
GOSTEI 0
Sidney Abreu
17/03/2015
Desculpe, infelizmente não entendi o funcionamento
GOSTEI 0
Marcos P
17/03/2015
Onde lê-se : 'AND ped.tipo_id in( ' +.:tipo ')'+
Leia : 'AND ped.tipo_id in( ' + :tipo ')'+
( não tem aquele ponto... )
Leia : 'AND ped.tipo_id in( ' + :tipo ')'+
( não tem aquele ponto... )
GOSTEI 1
Sidney Abreu
17/03/2015
Poxa, bacana! Muitíssimo obrigado! Show de bola. Você conhece algum livro onde eu possa aprender esses recursos?
Abraço
Abraço
GOSTEI 0
Marcos P
17/03/2015
Funcionou ?
Procura por "query dinâmica" no Google... é um recurso que pode ser bastante útil, tanto do lado do banco de dados como do lado da aplicação !
Procura por "query dinâmica" no Google... é um recurso que pode ser bastante útil, tanto do lado do banco de dados como do lado da aplicação !
GOSTEI 1
Sidney Abreu
17/03/2015
SIM, SIM, MUITO INTERESSANTE, VOU USAR PRA 'N' SITUAÇÕES
GOSTEI 0
Marcos P
17/03/2015
Ótimo !!!
GOSTEI 1
Sidney Abreu
17/03/2015
vc da aula particular?
GOSTEI 0
Marcos P
17/03/2015
Mal tenho tempo de conectar aqui pra tentar, de vez em quando, ajudar a galera !
GOSTEI 0
Sidney Abreu
17/03/2015
blz, de qualquer forma obrigado
GOSTEI 0
Walter Pereira
17/03/2015
Obrigado Marcos P essa sua dica me ajudou muito.
GOSTEI 0