Parametro vazio LIKE

8 respostas
N

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

8 Respostas

drsmachado

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.

javax.swing.Daniel
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 -> %_%

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");
drsmachado

[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.

N

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

drsmachado
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


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.

N

como uso essa tag code??

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

drsmachado
NicoBondarenco:
como uso essa tag code??
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.

Criado 26 de junho de 2012
Ultima resposta 26 de jun. de 2012
Respostas 8
Participantes 3