Eae galera beleza, estou tendo uma dificuldade com o operador like usando select, tenho uma tabela de itens de venda. Tenho uma tela de procurar onde o usuario digita uma letra e procura automaticamente nos campos da tabela, segue o select:
String sql = "SELECT codigo, composto, dureza, molde, desc_item, medida1, medida2, medida3,"
+ "medida4 FROM itemvenda WHERE desc_item LIKE ? and dureza LIKE ? and molde LIKE ? and composto LIKE ? "
+ "and medida1 LIKE ? and medida2 LIKE ? and medida3 LIKE ? and medida4 LIKE ? ORDER BY codigo";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, "%"+desc+"%");
pstmt.setString(2, "%"+dureza+"%");
pstmt.setString(3, "%"+molde+"%");
pstmt.setString(4, "%"+composto+"%");
pstmt.setString(5, "%"+med1+"%");
pstmt.setString(6, "%"+med2+"%");
pstmt.setString(7, "%"+med3+"%");
pstmt.setString(8, "%"+med4+"%");
Problema: É que uma tela de procura de vários campos juntos, porém não obrigatorios, se o usuário digita a letra ‘R’ na descrição ele deveria trazer os 3 itens cadastrados, porém ele não traz os itens que tem campo nulo, como tratar essa parte no like? Alguém já passou por isso?
Obrigado 
Aqui o select com campo nulo e o resultado
SELECT codigo, composto, dureza, molde, desc_item, medida1, medida2, medida3, medida4 FROM itemvenda WHERE desc_item LIKE '%R%' and medida1 LIKE '%%' ORDER BY codigo
Bom dia,
Silva, se vc quer pesquisar com campos não obrigatórios é só usar o OR. Eu fiz alguns testes no sqlfiddle.
create table itemvenda
(
id decimal(2),
descricao varchar(50),
dureza varchar(50),
molde varchar(50)
);
insert itemvenda values(1, 'PRODUTO 1', 'FRAGIL', 'RETANGULAR');
insert into itemvenda values(2, 'PRODUTO 2', 'MEDIO', 'CIRCULAR');
insert into itemvenda values(3, 'PRODUTO 3', 'FRAGIL', 'TRIANGULAR');
insert into itemvenda values(4, 'PRODUTO 4', 'DURISSIMO', 'CIRCULAR');
insert into itemvenda values(5, 'PRODUTO 5', 'MEDIO', 'RETANGULAR');
insert into itemvenda values(6, 'PRODUTO 6', 'DURO', 'RETANGULAR');
Para fazer essa pesquisa fiz a seguinte query:
select *
from itemvenda
where
(descricao like "%PR%"
or "%PR%"= "") --Aonde está valor é para ser passado o argumento
and (dureza like "%FRA%"
or "%FRA%" = "") --Aonde está valor é para ser passado o argumento
and ( molde like "%%"
or "%%" = "") --Nesse ponto simulei passar um parametro vazio
;
Com parâmetros:
descricao = PR
dureza = FR
molde =
- id descricao dureza molde
- 1 PRODUTO 1 FRAGIL RETANGULAR
- 3 PRODUTO 3 FRAGIL TRIANGULAR
Com parâmetros:
descricao = PR
dureza = FR
molde = RET
- id descricao dureza molde
- 1 PRODUTO 1 FRAGIL RETANGULAR
Olá Davi,
Na verdade, eu pesquisei bastante e li bastante documentação da Oracle e nada chegava a uma conclusão. Tu me deu uma solução simples e prática que eu nem tinha pensado ainda. Porém não deu certo, mas agora me fez pensar que o problema esteja em algo de manipulação do Banco do Oracle que eu ainda não achei, ou que meu próprio banco esteja com problema. Porque eu até tentei fazer um select simples pra buscar campo nulo como este:
`select * from itemvenda where medida1 = “”
Mas me retornou “No Data Found”.`
Silva, deixa eu entender melhor seu problema… Valores nulos tem um comportamento diferente de string vazia.
Tente algo nesse formato
select *
from itemvenda
where
(descricao like "%PR%"
or "%PR%"= ""
or descricao is null
)
and (dureza like "%FRA%"
or "%FRA%" = ""
or dureza is null
)
and ( molde like "%%"
or "%%" = ""
or molde is null )
;
Meu problema é o seguinte, eu melhorei a select pra ve se fica melhor pra entender
SELECT * FROM itemvenda WHERE (desc_item LIKE '%R%' OR desc_item = '') AND (medida1 LIKE '%%' or medida1 = "")
O usuário tem opção de digitar mais de um campo para pesquisa (Descrição e Medida) ambos opcionais. O problema é a parte de medida1 = “” O Oracle não está entendendo vazio = nulo, mas sim entendendo como se vazio fosse algum dado e não retorna item que tem medida ou descrição como nulo. Até tentei usar is Null, mas ele não funciona do jeito correto. Desculpa se ficou meio confuso, é que eu to tentando várias coisas, então conforme eu vou tentando e vou pensando e achando coisas diferentes, mas deu pra entender mais ou menos o problema agora?
Tenta isso
SELECT * FROM itemvenda WHERE (desc_item LIKE '%R%' OR coalesce(desc_item,'') = '') AND (medida1 LIKE '%%' or coalesce(medida1,'') = '')
Se houver nulo o coalesce vai converter para string vazia.