PreparedStatement con query concatenada variable

Fernando Tubio
14 de Agosto del 2011
buenas la cosa viene asi....

un sql con los siguientes parametros de filtrado
fecha ini, fecha fin, id_agente y estado
anteriormente eran unos if con los que concatenabas la query de acuerdo a si tenia o no valores la vble.

y ahora con PreparedStatement se me complico.
si viene una fecha y la otra no debo quitarla del where
al igual que si falta el id
como tengo que hacer?
O bien es demasiado variable la clase al parametrizarla con tantos valores.

se entiende?

Humberto Prada Niño
07 de Septiembre del 2011
Lo primero que debes hacer es crear la consulta con todos los parametros que podría llevar.
Luego se deben inicializar los valores de los parámetros como vacios para el caso de que no tenga un valor entonces al aplicar el like toma '%%' lo cual corresponde a que en este parámetro no tiene en cuenta valor.
y en el paso siguiente asigna los valores que si tenga para enviar a la consulta.

String sql=" SELECT * FROM TABLA WHERE PAR1 LIKE '%'|| ? ||'%' AND PAR2 LIKE '%'|| ? ||'%' AND PAR3 LIKE '%'|| ? ||'%' ";
PreparedStatement ps= Connection.prepareStatement(sql);
String par1="";
String par2="";
String par3="";

//Aqui debe asignar los valores que si apliquen

ps.setString(1,par1);
ps.setString(2,par2);
ps.setString(3,par3);

ResultSet rs=ps.executeQuery();

//Imagino que de aquí en adelante ya sabes como es el manejo del ResultSet
............

En el caso de fechas se debe utilizar funciones para convertir a texto de tal manera que aplique el '%%'. Por ejemplo para el caso de postgres se puede utilizar un casting asi:
select * from tabla
where cast(fecha as varchar) like '%'|| ? ||'%'

Esteban perez
02 de Octubre del 2013
que tal amigo amm podrias mostrarle la manera en la que concatenabas tu consulta con los if ya que tengo que realizar una busqueda en mysql espero puedas ayudarme gracias!!