Dúvida SQL e manipulação de strings

Boxxer

Power Member
Boas,

tenho uma tabela da qual faz parte uma coluna NOME que tem nomes completos de pessoas. Ou seja, não há uma distinção entre nome próprio e apelido. Contém valores do estilo "José Luís Ribeiro Sousa".
Tenho uma outra tabela com nomes, mas que tem 3 colunas com 1º nome, apelido e nome do meio.

Eu preciso de procurar na 1ª tabela por nomes que estejam na 2ª, mas a contar que haja erros, nomes mal escritos, partes do nome que possam faltar, etc...

Portanto, basicamente, queria fazer um

Select *
from TABELA1
where nome like ..... (select APELIDO from TABELA2)

Claro que isto em SQL não funciona, porque o LIKE só usa 1 valor, e não uma lista deles.
Mas como é que posso comparar todos os nomes da 1ª tabela com os apelidos da 2ª sem ter que fazer um programeta?

Tipo... devolver todos os nomes da 1ª tabela que contenham qualquer valor da coluna APELIDO da 2ª tabela?

Seria como fazer uma lista de valores (NOME in ('valor1', 'valor2',) etc....), mas para cada valor usar um LIKE '%valor1%', '%valor2%', etc...

Alguém sabe duma forma para conseguir isto em SQL?
 
Sim, a própria IBM tem muita informação sobre expressões regulares, mas o meu problema mantém-se porque eu não quero estruturar uma sintaxe com algumas variáveis (ou wildcards) para escolher dados de uma tabela. Eu quero comparar dados de duas tabelas, e bastava-me gerar uma lista de todos os valores de uma coluna, sendo cada um deles delimitado por % ou seja, se a coluna da tabela tem SILVA, SANTOS, LOPES (...), eu quero que esses valores sejam comparados com os nomes da 1ª tabela como se fossem %SILVA%, %SANTOS%, %LOPES%, etc...

O que as expressões regulares não me permitem é a dinâmica de usar strings oriundos de um outro SELECT, e pensei que houvesse forma de o fazer.
 
acho que assim te resolveria:

:arrow: select * from db1.tabela1, db2.tabela2 where tabela1.coluna1=tabela2.coluna2;

esse é um modo, mas o modo 'where' é considerado um tanto lerdo e existe uma forma que você diz algo mais ou menos assim:

DENTRO DE (coluna1, coluna2, coluna3, coluna4)

algo como: "Me retorne todo nome que for igual a "Tal" e que esteja dentro de ...", eu estava lendo isso ontem em um livro de SQL mas realmente não decorei.

ou, você pode usar o where like '%nome%' que te resolve também, mas não tem muita performace.
 
acho que assim te resolveria:

:arrow: select * from db1.tabela1, db2.tabela2 where tabela1.coluna1=tabela2.coluna2;

esse é um modo, mas o modo 'where' é considerado um tanto lerdo e existe uma forma que você diz algo mais ou menos assim:

DENTRO DE (coluna1, coluna2, coluna3, coluna4)

algo como: "Me retorne todo nome que for igual a "Tal" e que esteja dentro de ...", eu estava lendo isso ontem em um livro de SQL mas realmente não decorei.

ou, você pode usar o where like '%nome%' que te resolve também, mas não tem muita performace.

Obrigado :)

Também já tinha experimentado com um join normal, usando o WHERE A.NOME LIKE B.APELIDO mas também não faz o que eu quero.

E se usar A.NOME IN ('valor1', 'valor2', 'valor3', ...) fica muito rígido, porque eu queria usar o LIKE, mas com uma lista de valores em vez de 1 só.
O problema é que essa lista tem que ser um SELECT, também... isso é que está a complicar tudo.
 
Ora experimenta lá:

SELECT DISTINCT TBL1.*
FROM TBL1, TBL2 WHERE TBL1.NOME like '%'+TBL2.APELIDO + '%'

Julgo que faz o que pretendes, embora não seja muito optimizado. Com tabelas muito grandes deve ter um custo de processamento medonho....

Aconselho-te também a dares uma vista de olhos na função Soundex(), que permite fazer comparações por semelhança fonética. Utilizo num sistema em que tenho de comparar tabelas de fontes diferentes, e obtenho resultados bastante satisfatórios (em Sqlserver).
 
Back
Topo