SQL - Consultas com alteração dinâmica

Bem, não sei se esse é o título correto sobre o que eu preciso mas vamos lá.

Tenho uma aplicação desktop que a sua função é apenas realizar consultas em dois bancos de dados.
A consulta é feita, baseada em alguns filtros e apresentada em uma JTable.

As inctruções sql são criadas da seguinte forma:
Primeiro crio a primeira parte, com o select e o “join”:

SELECT a.nome, m.ra FROM aluno a, matricula m WHERE a.ra = m.ra

A segunda parte é onde os filtros entram em ação, chamo um método obtendo a string contida num componente swing.

[code]
public static String obtemFiltros( String curso, String matriculaA, String matriculaAte) {

StrungBuffer sb = new StringBuffer();

// curso se encontra num combo, com os cursos ou a opção de todos
if ( !curso.equals( "TODOS" ) ) {
    sb.append( "AND m.curso = " curso );
}

// as matriculas estão em um text field
if ( !matriculaA.equals( "" ) ) {
    sb.append( "AND m.matricula >= " matriculaA );
}
if ( !matriculaAte.equals( "" ) ) {
    sb.append( "AND m.matricula <= " matriculaAte );
}

return sb.toString();

}[/code]

E por fim na terceira parte eu finalizo a query se necessário usando um order by ou group by

ORDER BY a.nome

Ok, numa aplicação desktop isso não é uma tarefa tão complicada.

Só que estou convertendo essa aplicação desktop para web, e preciso fazer todas essas consultas (são mais de 50 diferentes) e quero fazer isso dentro de um JSP, passando os filtros através da tag sql:param. O problema é que quando um combo no meu form está em TODOS, eu uso LIKE para comparar uma string e passo %, até ai tudo bem, e quando um campo está vazio eu não sei o que fazer, e se for numérico como eu posso fazer com que a comparação m.matriculaA = valorDoCampo seja ignorada, ou seja, fazer com que qualquer m.matriculaA seja pesquisada.

Gostaria de saber o que fazer, não queria fazer um jsp para cada consulta e sim um genérico que passa todos os parametros do form de consulta e quando um campo estiver vazio, seja realiza uma consulta em tudo.

Espero que tenham entendido.
Aguardo resposta!

É Oracle?

Se for vc pode usar nvl().

Assim:

Cria um PreparedStatement com uma query parecida com essa:

 SELECT a.nome, m.ra FROM aluno a, matricula m
 WHERE a.ra = m.ra
 AND m.curso = nvl(?, m.curso)
 AND m.qualquerCharColumn LIKE '%'||nvl(?, m.qualquerCharColumn)||'%' 
 ORDER BY a.nome

E quando for usar, basta dar um setXXX com o que vc recebe do jsp, quando não for nulo, dessa forma o AND do WHERE será considerado.

Se for nulo, faça setNull e o filtro não terá efeito.

Ok?

[]s

Muito obrigado pela resposta, mas são dois bancos… Um é Interbase e o outro é SQL Server.

Mesmo assim valeu a dia!

Até mais!

Estou precisando fazer uma consulta dinâmica o pior de tudo que é com PreparedStatement. Como vc montou essa consulta ?

Se fosse na JPQL era tranquilo …

tópico antigo :shock: !