Página 1 de 1
Consulta por trechos de texto
Enviado: Qua, 19 Set 2012 11:54 am
por Marciel
Bom dia,
Tenho uma tabela com um campo com o nome completo de pessoas. Tenho a seguinte SQL para consulta:
Selecionar tudo
SELECT * FROM PESSOAS WHERE NOME LIKE '%' || REPLACE(:FILTRO, ' ', '%') || '%';
Assim o usuário pode digitar "JOSÉ SILV" e resultados semelhantes retornarão, como "JOSÉ DA SILVA" e "PAULO JOSÉ SILVEIRA".
Agora a situação que preciso: Buscar com o texto: "JOSÉ MARIA" e retornar todos os nomes que contenham as duas palavras da string, em qualquer ordem, como "JOSÉ ANTONIO MARIA" e "MARIA JOSÉ".
Tem algum recurso de SQL do Oracle que me ajude nisso?
Re: Consulta por trechos de texto
Enviado: Qua, 19 Set 2012 6:01 pm
por fsitja
Fiz um exemplo rápido sem testar muito, se puder verificar melhor por gentileza, seria isso:
Selecionar tudo
SQL> create table pessoa as
2 select 'JOSÉ ANTONIO MARIA' nome from dual union all
3 select 'MARIA JOSÉ' from dual union all
4 select 'MARIANA JOSÉ' from dual union all
5 select 'JOSÉ' from dual union all
6 select 'LUCAS' from dual union all
7 select 'MARIA' from dual;
Table created
SQL> with t as (
2 select 'JOSÉ MARIA' filtro from dual
3 ) -- fim do filtro
4 select p.nome
5 from pessoa p
6 where not exists (select 1
7 from (select regexp_substr(filtro, '\S+', 1, level) nome
8 from t
9 connect by regexp_substr(filtro, '\S+', 1, level) is not null) f
10 where regexp_instr(p.nome, '([^[:alpha:]]|^)' ||f.nome || '([^[:alpha:]]|$)') = 0);
NOME
------------------
JOSÉ ANTONIO MARIA
MARIA JOSÉ
O recurso usado é chamado de expressões regulares, tem mais informações aqui:
http://docs.oracle.com/cd/E11882_01/app ... regexp.htm
Basicamente a lógica é repartir a string do filtro em palavras separadas por espaço, tratar essas palavras como se fossem uma tabela e fazer uma pesquisa que peça por todos nomes de pessoas onde não exista (not exists) nenhuma dessas palavras
ausentes.
Re: Consulta por trechos de texto
Enviado: Qui, 20 Set 2012 3:28 pm
por fbifabio
Pessoal,
Tenho um artigo em meu blog onde comento sobre expressões regulares, para aqueles que quiserem obter mais informações sobre o assunto:
http://www.fabioprado.net/2010/10/expre ... lares.html
[]s
Fábio Prado
www.fabioprado.net