Parametro vazio LIKE

Bom dia,

Eu fiz uma consulta no banco de dados usando o comando LIKE passando 3 parametros(JtextField).
O problema é que quando eu deixo um dos campos em branco da erro.
e na verdade eu queria que se o campo ficasse em branco ele listasse todos.
Por exemplo: eu consulto o cliente por codigo, nome e cpf. se eu deixar o campo codigo em branco ele consultaria por nome e cpf e todos os codigos.
tipo:
tenho os clientes
Codigo----------Nome-----------------CPF
-------7----------José Silva------------654321
------12---------José Santos----------321654
------13---------José Souza-----------987654

se eu passar os parametro (codigo,nome,cpf) como (1,josé,654)
ele lista os josés de codigo 12 e 13.

mas se eu passo os parametros (null,josé,654) ele não lista nenhum, o que eu quero é saber que parametro eu jogo no lugar do null para listar os 3 josés neste caso.

se ficar mais clara minha duvida, eu quero que funcione como o LIKE do Access.

Desde ja agradeço

Como está a query?
Posta o trecho do código que contém a mesma, para que fique mais fácil entendermos como você está criando a consulta.

Ele retorna os clientes 12 e 13 porque ele reconhece:
O número 1 dentro do 12 e 13;
O nome José;
O cpf que contém 654.

Porém quando você põe NULL no código ele não vai retornar nada, pois não tem cliente com código null.

Você pode colocar no código desta maneira -> %_%

Fiz uma linha de comando como exemplo:

rs = state.executeQuery("SELECT * FROM Cliente WHERE id LIKE '%_%' AND cpf LIKE '%654%' ORDER BY id");

[quote=javax.swing.Daniel]Fiz uma linha de comando como exemplo:

rs = state.executeQuery("SELECT * FROM Cliente WHERE id LIKE '%_%' AND cpf LIKE '%654%' ORDER BY id");

Procedimento técnico não homologado, também conhecida como gambiarra.
Não é preciso fazer isso, ele pode controlar pelo java mesmo, basta realizar uma verificação, validando se o parâmetro é nulo ou não.

DELIMITER $$

USE ‘locacaoinf’

DROP PROCEDURE IF EXISTS ‘sp_conscliente’$$

CREATE DEFINER=‘root’@‘localhost’ PROCEDURE ‘sp_conscliente’ (IN codigo int, IN nome VARCHAR(100), IN cpf BIGINT)
BEGIN
SELECT * FROM cliente WHERE codcliente LIKE CONCAT(’%’,codigo,’%’) AND nomecliente LIKE CONCAT(’%’,nome,’%’) and cpfcliente LIKE CONCAT(’%’,cpf,’%’);
END

DELIMITER ;

essa é minha procedure criada no mysql

no java eu “seto” a query assim:
query = “CALL sp_conscliente(”+Integer.ParseInt(txCodCliente.getText())+","+txNomeCliente.getText()+","+Long.ParseLong(txCPFCliente.getText())+")";
e uso o executequery

se eu passo os 3 parametros funciona, mas se eu deixar um campo em branco não aparece nenhum resultado.

Obs.: não sei se faz diferença, mas eu utilizo netbeans

[quote=NicoBondarenco]DELIMITER $$

USE ‘locacaoinf’

DROP PROCEDURE IF EXISTS ‘sp_conscliente’$$

CREATE DEFINER=‘root’@‘localhost’ PROCEDURE ‘sp_conscliente’ (IN codigo int, IN nome VARCHAR(100), IN cpf BIGINT)
BEGIN
SELECT * FROM cliente WHERE codcliente LIKE CONCAT(’%’,codigo,’%’) AND nomecliente LIKE CONCAT(’%’,nome,’%’) and cpfcliente LIKE CONCAT(’%’,cpf,’%’);
END

DELIMITER ;

essa é minha procedure criada no mysql

no java eu “seto” a query assim:
query = “CALL sp_conscliente(”+Integer.ParseInt(txCodCliente.getText())+","+txNomeCliente.getText()+","+Long.ParseLong(txCPFCliente.getText())+")";
e uso o executequery

se eu passo os 3 parametros funciona, mas se eu deixar um campo em branco não aparece nenhum resultado.

Obs.: não sei se faz diferença, mas eu utilizo netbeans
[/quote]
1 - Use a tag [code]
2 - Isso tá meio gambiarrístico demais, não?
O problema é que ao faze concat, você não analisa se o parâmetro passado está ou não vazio. Esse controle não é do banco de dados, efetivamente. Porém, como você está usando um padrão orientado a banco de dados, que é com stored procedure, deve validar o conteúdo das variáveis.

como uso essa tag code??

ops… very noob mode on… me toquei so agora da tag code, eu tava achando que era no mysql

Quando abro um tópico:
Há uma lista de rich buttons acima da caixa de texto, dentre eles, o Code.
Clicado uma vez, ele será marcado com um * e colocará na caixa de texto uma marcação [code]
Clicado uma segunda vez, a marcação * desaparece e ele fecha a tag anterior.

Quando respondendo - resposta rápida:
Pressione CTRL + C uma vez e terá a tag code aberta. Uma segunda vez, ela será fechada.

Quando respondendo - resposta/citação/edição:
O mesmo de quando abre tópico, botão code.