Fórum trazer resultados parecidos numa consulta com Like #189192

16/10/2003

0

Olá e obrigado por ter dado uma passadinha aqui...
Meu problema é o seguinte, Tenho um cadastro de pessoas onde não posso deixar duplicar ninguém.
Na hora de pesquisar uma pessoa no banco gostaria de trazer nomes semelhantes como por exmeplo:

Silmara
Sylmara
Cilmara

Se alguém tiver um algorítmo que faça esse tipo de busca preciso com alguma urgência... []´s a todos :wink:


Btovix

Btovix

Responder

Posts

16/10/2003

Marcelo.c

LIKE ´¬mara¬´ não resolveira o problema ?


Responder

Gostei + 0

16/10/2003

Diogoalles

acho q Like resolveria o problema
e para a pesquisar ignorar maiusuclas e minusculas utilize upper
select ....
where upper(campo) like upper(¬mara¬)

abraço

Diogo


Responder

Gostei + 0

16/10/2003

Everton

btovix,

tenho uma rotina que faz esse tipo de pesquisa, porém é necessário que exista uma tabela de conversão:

CODIGO -> Sequencial
LOCALIZAR -> String a ser substituída
SUBSTITUIR -> String que irá substituir

Exemplo:

Codigo -> Localizar -> Substituir
1 -> Y -> I -> irá subtituir Y por I
2 -> DN -> DIN -> irá subtituir DN por DIN

Possui também uma UDF para substituição de string.

Os interessados enviar email para ertgarcia@pop.com.br


Responder

Gostei + 0

17/10/2003

Btovix

Olá pessoal e obrigado pelas respostas, mas tenho que explicar melhor como ocorre...

Pode ter certeza que vou usar o Like nas minhas pesquisas, mas o que ocorre é que o usuário vai digitar [b:af7cf894b8]Silmara[/b:af7cf894b8] e eu tenho que trazer variações deste nome indicado conforme expliquei acima

Silmara
Sylmara
Cilmara

e ´de quebra´ tenho que trazer [b:af7cf894b8]Silmaria[/b:af7cf894b8] e suas possíveis derivações... (lógico que vou limitar esse tipo de coisa)

Espero que agora eu tenha explicado melhor a minha dúvida...
[]´s a todos e continuo aguardando :wink:


Responder

Gostei + 0

17/10/2003

Everton

Colega,

a rotina que possuo é exatamente o q vc quer.

Necessidades:

1) Tabela de Conversão;
2) UDF com as funções:
- GetLength (retorna o tamanho de uma strring);
- GetPosicao (retorna a posição de uma SubString em uma string);
3) UDF SubStr;
4) Duas procedures:
- Converte e Substituir;

//***************************************
Procedure Subtituir:
//***************************************
CREATE PROCEDURE SUBSTITUIR (
PA_NOME VARCHAR(240) CHARACTER SET NONE,
PA_REMOVER VARCHAR(240) CHARACTER SET NONE,
PA_INSERIR VARCHAR(240) CHARACTER SET NONE)
RETURNS (
NOME VARCHAR(240) CHARACTER SET NONE)
AS
DECLARE VARIABLE F_CONSULTA VARCHAR(240);
begin
SELECT SUBSTR (:PA_NOME,
((SELECT GETPOSICAO(:PA_REMOVER,:PA_NOME) FROM RDB$DATABASE)+
(SELECT GETLENGTH(:PA_REMOVER) FROM RDB$DATABASE)),
(SELECT GETLENGTH(:PA_NOME) FROM RDB$DATABASE))
FROM RDB$DATABASE
INTO :F_CONSULTA;
IF (:F_CONSULTA IS NOT NULL) THEN
BEGIN
SELECT SUBSTR (:PA_NOME,
1,
(SELECT GETPOSICAO(:PA_REMOVER,:PA_NOME) FROM RDB$DATABASE)-1)
||:PA_INSERIR||
(SELECT SUBSTR (:PA_NOME,
((SELECT GETPOSICAO(:PA_REMOVER,:PA_NOME) FROM RDB$DATABASE)+
(SELECT GETLENGTH(:PA_REMOVER) FROM RDB$DATABASE)),
(SELECT GETLENGTH(:PA_NOME) FROM RDB$DATABASE))
FROM RDB$DATABASE)
FROM RDB$DATABASE
INTO :NOME;
SUSPEND;
END
ELSE
BEGIN
SELECT SUBSTR (:PA_NOME,
1,
(SELECT GETPOSICAO(:PA_REMOVER,:PA_NOME) FROM RDB$DATABASE))
||:PA_INSERIR
FROM RDB$DATABASE
INTO :NOME;
SUSPEND;
END
end


//***************************************
Procedure Converte:
//***************************************
ALTER PROCEDURE CONVERTE (
PA_NOME VARCHAR(240) CHARACTER SET NONE)
RETURNS (
NOME VARCHAR(240) CHARACTER SET NONE)
AS
DECLARE VARIABLE NOME_CONV_1 VARCHAR(240);
DECLARE VARIABLE INSERIR VARCHAR(240);
DECLARE VARIABLE REMOVER VARCHAR(240);
begin
FOR SELECT VELHA, NOVA FROM CONVERSAO
ORDER BY VELHA
INTO :REMOVER, :INSERIR
DO
BEGIN
FOR SELECT NOME FROM SUBSTITUIR(:PA_NOME,:REMOVER,:INSERIR)
INTO :NOME_CONV_1
DO
BEGIN
IF (NOME_CONV_1 IS NOT NULL) THEN
BEGIN
FOR SELECT VELHA, NOVA FROM CONVERSAO
ORDER BY VELHA
INTO :REMOVER, :INSERIR
DO
BEGIN
FOR SELECT NOME FROM SUBSTITUIR(:NOME_CONV_1,:REMOVER,:INSERIR)
ORDER BY NOME
INTO :NOME
DO
BEGIN
IF (NOME IS NOT NULL) THEN
SUSPEND;
END
END
END
END
END
end


5) Estrutura da tabela CONVERSAO
- Codigo -> Sequencial
- Velha -> String a ser substituída
- Nova -> String subtituta

onde:
Velha seria o I (e o S) de Silmara e Nova o Y ( e o C)... ou seja ... ele irá buscar por Sylmara (Cylmara, Cilmara e por Silmara).


6) quem quizer a UDF mande um email pra ertgarcia@pop.com.br.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar