[RESOLVIDO]Select com stmt não entende o in(?)

Bom dia pessoal!

Estou fazendo uma consulta e usando a função in(‘xx’,‘xx’) do sql, porém o statement não está funcionando como achei que deveria.

Os dados que estão dentro do in são do tipo string, por isso usei aspas.

			String sql ="SELECT producao, rua from tblProducao where planta = ? and data between ? and ? and rua in(?) " 			

			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, oee.getPlanta());
			stmt.setString(2, (separa.arraytRua(oee.getRua())));
			stmt.setString(2, oee.getDataInicial());
			stmt.setString(3, oee.getDataFinal());
			ResultSet rs = stmt.executeQuery();	

O pior é que passei os valores manualmente dentro do in() e a consulta só retorna dados do primeiro boloco:

String sql ="SELECT producao, rua from tblProducao where planta = ? and data between ? and ? and rua in('22','01') "

No caso acima está trazendo dados apenas da rua 22, se eu inverto e coloco primeiro 01 depois 22 a consulta só traz dados da rua 01.
O que posso estar fazendo errado?

Abraços!

Acredito que seja a ordem dos valores:
stmt.setString(1, oee.getPlanta());
stmt.setString(4, (separa.arraytRua(oee.getRua())));
stmt.setString(2, oee.getDataInicial());
stmt.setString(3, oee.getDataFinal());

ou seu methodo
separa.arraytRua(oee.getRua())

Ja o caso da query magica manda mais informações.
Manda a query completa que vc esta montando, retira as outras condiçoes para entender melhor o resultado.

[quote=tiozao_bp]Acredito que seja a ordem dos valores:
stmt.setString(1, oee.getPlanta());
stmt.setString(4, (separa.arraytRua(oee.getRua())));
stmt.setString(2, oee.getDataInicial());
stmt.setString(3, oee.getDataFinal());

ou seu methodo
separa.arraytRua(oee.getRua())

Ja o caso da query magica manda mais informações.
Manda a query completa que vc esta montando, retira as outras condiçoes para entender melhor o resultado.
[/quote]

Não é não, errei na hora de transcrever aqui, e como eu eu disse mesmo colocando os valores manualmente não vai… porque será?

SQL mais simples que tabém deveria funcionar, mas não traz nada:

			String sql ="SELECT * FROM OEE where planta = ? and rua in(?) and data between ? and ? ";
			
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, oee.getPlanta());
			stmt.setString(2, oee.getRua());
			stmt.setString(3, oee.getDataInicial());
			stmt.setString(4, oee.getDataFinal());
			ResultSet rs = stmt.executeQuery();

Nessa que eu coloquei os valores manualmente ele só traz registro da rua 22, se eu inverter a ordem ele só traz dados da rua 01.

			String sql ="SELECT * FROM OEE where planta = ? and rua in('22','01') and data between ? and ? ";
			
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, oee.getPlanta());
			//stmt.setString(2, oee.getRua());
			stmt.setString(2, oee.getDataInicial());
			stmt.setString(3, oee.getDataFinal());
			ResultSet rs = stmt.executeQuery();

Eu hein!!! nunca vi isso…

Eu cheguei escrever toda a SQL manualmente, sem usar o stmt, mesmo assim no bloco do in(‘22’,‘01’,‘04’,‘27’,‘29’) ele só traz dados da primeira rua, as seguintes não vem.

[quote]No caso acima está trazendo dados apenas da rua 22, se eu inverto e coloco primeiro 01 depois 22 a consulta só traz dados da rua 01.
O que posso estar fazendo errado?

Abraços! [/quote]

Pode ser que o seu problema esteja nos filtros,

where planta = ? and data between ? and ? and rua in('22','01')

Nessa SELECT, você está obrigando que todos os registros retornem com todos os filtros, se um dos registros não estiver nessa restrição, eles não são recuperados, tente usar ‘OR’ ao invés de ‘AND’.

[quote=Ailton_Occhi]Bom dia pessoal!

Estou fazendo uma consulta e usando a função in(‘xx’,‘xx’) do sql, porém o statement não está funcionando como achei que deveria.

[/quote]

Em relação ao in, realmente não funciona desta forma. Você vai ter que montar concatenando no sql ou então montando a String sem os apóstrofes no início e no fim, pois o método setString vai colocar automaticamente.

Ex.:

...
String ruas = "01','22','33"; //montar sem apóstrofes no início e fim da String
...
stmt.setString(3, ruas);

[quote=rafadelnero]
Pode ser que o seu problema esteja nos filtros,

where planta = ? and data between ? and ? and rua in('22','01')

Nessa SELECT, você está obrigando que todos os registros retornem com todos os filtros, se um dos registros não estiver nessa restrição, eles não são recuperados, tente usar ‘OR’ ao invés de ‘AND’.[/quote]

Eu quero forçar a isso, o and está correto, o problema está somente no in mesmo, pra você ter um idéia eu filtrei dados que sei que existem.

Fiz até assim rodou perfeito: where planta = ? and data between ? and ? and rua = '22' and rua = '01'

Agora com a merda do IN não vai nem a pau!!!

[quote=g4j]
Em relação ao in, realmente não funciona desta forma. Você vai ter que montar concatenando no sql ou então montando a String sem os apóstrofes no início e no fim, pois o método setString vai colocar automaticamente.

Ex.:

[code]

String ruas = “01’,‘22’,'33”; //montar sem apóstrofes no início e fim da String

stmt.setString(3, ruas);

[/code][/quote]

Cara mas porque mesmo sem usar o stmt não funciona? é isso que não entendo, eu ignorei o stmt, coloquei os valores manualmente rua in(‘01’,‘22’,‘23’) e ele está trazendo resultado somente da rua 01, se eu mudar a ordem rua in(‘23’,‘22’,01’) ele traz somente da rua 23, ou seja, só está fitrando o primeiro valor, os outros ele não traz.

[quote=Ailton_Occhi]

Cara mas porque mesmo sem usar o stmt não funciona? é isso que não entendo, eu ignorei o stmt, coloquei os valores manualmente rua in(‘01’,‘22’,‘23’) e ele está trazendo resultado somente da rua 01, se eu mudar a ordem rua in(‘23’,‘22’,01’) ele traz somente da rua 23, ou seja, só está fitrando o primeiro valor, os outros ele não traz.[/quote]

Se você executar só com o in, sem os outros filtros, o que traz?

[quote=g4j]
Se você executar só com o in, sem os outros filtros, o que traz? [/quote]

Faz a mesma coisa, só traz os valores da primeira rua, aqui no caso da rua 22

"Select * from OEE where rua in('22','01','23')" :shock:

Acho que está ocorrendo uma certa confusão com o autor.

Não tem como o código acima funcionar. Não tem como rua ser igual a 22 E igual a 01 ao mesmo tempo.
Onde exatamente você rodou sua query?

O problema com sua query inicial é que você está considerando todos os valores do in como apenas um.
Para cada valor que irá usar no in, precisa usar um ? na sua query.
Ou seja, algo assim:

  String query =  " SELECT * FROM tabela WHERE campo IN (?,?,?) ";
  stm.setString(1, primeiroValor);
  stm.setString(2, segundoValor);
  stm.setString(3, terceiroValor);

Para usar o in, precisa contar antes quantos parâmetros existem no IN e montar dinamicamente sua query baseado nisso.

Uma pergunta Ailton_Occhi,
a tabela “tblProducao” é mesmo uma tabela ou é um a view ??

[quote]Não tem como o código acima funcionar. Não tem como rua ser igual a 22 E igual a 01 ao mesmo tempo.
Onde exatamente você rodou sua query?

O problema com sua query inicial é que você está considerando todos os valores do in como apenas um.
Para cada valor que irá usar no in, precisa usar um ? na sua query.
Ou seja, algo assim:

  String query =  " SELECT * FROM tabela WHERE campo IN (?,?,?) ";
  stm.setString(1, primeiroValor);
  stm.setString(2, segundoValor);
  stm.setString(3, terceiroValor);

Para usar o in, precisa contar antes quantos parâmetros existem no IN e montar dinamicamente sua query baseado nisso.[/quote]

Tem sim, é como se eu tivesse mandando selecionar os dados da rua 22 e da rua 01, por isso rodou, quanto ao in, não tem como parametrizar quantos ruas serão selecionadas, vai depender do que o usuário filtrar, no caso as ruas vem como um array.

Agora quer saber o pior mesmo???

ERA PAU NO DRIVER!!! REINSTALEI O JDBC E AGORA FUNFOU!!!

Deixei do jeitinho que estava e rodou!!!
Vai entender essa merda de windows!!! :evil:

GALERA, DE QUALQUER FORMA FICO MUITO GRATO PELA AJUDA!!!

Segue como o código ficou:

String sql ="SELECT * FROM OEE where planta = ? and rua in(?) and data between ? and ? ";   
  
PreparedStatement stmt = this.connection.prepareStatement(sql);   
stmt.setString(1, oee.getPlanta());   
stmt.setString(2, oee.getRua());   
stmt.setString(3, oee.getDataInicial());   
stmt.setString(4, oee.getDataFinal());   
ResultSet rs = stmt.executeQuery();