2011-01-15 3 views
12

Estoy tratando de escribir una declaración Seleccionar donde puedo ver si una columna es como parte de otra.Comparación de columnas donde una es similar a parte de otra

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

La consulta debe devolver:

3 | Mrs.Betty Smith, Chair | Jill 

Sin embargo mío acaba devuelve cada fila de la tabla:

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

¿Alguna idea?

Respuesta

19

Invertir el dónde, a algo como esto:

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

Prueba esto:

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

El CHARINDEX será más rápido (con más prestaciones) que una cláusula LIKE, ya que no tiene que tomar en cuenta los comodines. Los datos de muestra anteriores con números pequeños de filas no mostrarán un beneficio de rendimiento, pero cuando se encuentren en millones de filas, CHARINDEX funcionaría mejor.

+0

+1. Por lo que escuché, incluso 'PATINDEX()' es más rápido que 'LIKE'. De todos modos, en este caso 'CHARINDEX()' es absolutamente aplicable y la mejor opción. –

3

Cambiar los argumentos a LIKE en la cláusula WHERE:

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

El comodín debe ser el segundo argumento.

1

Se ve bien, excepto que probablemente desea cambiar el orden en torno a su donde:

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

Los paréntesis también habrían solucionado el problema.

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

Oracle espera el número cuando se usa +. Para la secuencia, por favor utilice la samle a continuación:

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

para comparar una columna de una tabla de una columna de otra tabla, haga lo siguiente

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 ||'%' 
Cuestiones relacionadas