2011-01-15 6 views
12

J'essaie d'écrire une instruction Select où je peux voir si une colonne est comme une partie d'une autre.Comparer les colonnes où l'une est similaire à une autre

tblNames 
ID FullName     FirstName 
1  Mr. John Doe, CEO   John 
2  Mr. Jake Doe, Exec  Jake 
3  Mrs. Betty Smith, Chair  Jill 

La requête doit retourner:

3 | Mrs.Betty Smith, Chair | Jill 

Cependant le mien juste retourne chaque ligne de la table:

SELECT ID, FullName, FirstName 
FROM tblNames 
WHERE '%' + FirstName + '%' not like Fullname 

Toutes les idées?

Répondre

19

Inverser le où, à quelque chose comme ceci:

Fullname not like '%' + FirstName + '%' 
9

Essayez ceci:

SELECT * FROM tblNames 
WHERE ISNULL(CHARINDEX (FirstName , FullName),0) = 0 

Le CHARINDEX sera plus rapide (plus performante) qu'une clause LIKE, car il ne doit pas prendre en compte les caractères génériques. Les exemples de données ci-dessus avec un petit nombre de lignes ne présenteront aucun avantage en termes de performances, mais si CHARINDEX fonctionne mieux sur des millions de lignes.

+0

+1. D'après ce que j'entends, même 'PATINDEX()' est plus rapide que 'LIKE'. Quoi qu'il en soit, dans ce cas 'CHARINDEX()' est absolument applicable et le meilleur choix. –

3

Changer les arguments LIKE dans la clause WHERE:

SELECT ID, FullName, FirstName 
FROM tblNames 
WHERE Fullname not like '%' + FirstName + '%' 

Le caractère générique doit être le deuxième argument.

1

Il semble OK, sauf que vous voulez probablement changer l'ordre autour de votre où:

WHERE Fullname not like '%' + FirstName + '%' 
0

Les parenthèses auraient également résolu le problème.

SELECT ID, FullName, FirstName 
FROM tblNames 
WHERE ('%' + FirstName + '%') not like Fullname 
1

Oracle attend un nombre lorsque + est utilisé. Pour la chaîne, s'il vous plaît utiliser le SAMLE ci-dessous:

SELECT ID, FullName, FirstName 
FROM tblNames 
WHERE FullName like '%' || FirstName||'%' 

Pour comparer une colonne d'une table à une colonne d'une autre table, s'il vous plaît faire le

suivant
select a.*,table_2_col_1, table_2_col_2 from (select table_1_col_1, table_1_col_2 from table_1 where 
) a, table_2 where table_1_col_1 like '%' || table_2_col_1 ||'%' 
Questions connexes