2009-03-04 47 views
6

Estoy tratando de encontrar la manera, si es posible, de utilizar IN y LIKE juntos. Lo que quiero lograr es colocar una subconsulta que detenga una lista de datos en una declaración IN. El problema es que la lista de datos contiene comodines. ¿Hay alguna manera de hacer esto?¿Hay alguna forma de combinar IN con LIKE en una instrucción SQL?

Algo en lo que tenía curiosidad.

Example of data in the 2 tables 

Parent table 

ID Office_Code Employee_Name 
1  GG234   Tom 
2  GG654   Bill 
3  PQ123   Chris 

Second table 

ID Code_Wildcard 
1  GG% 
2  PQ% 

Nota aclaratoria (a través de terceros)

Desde que estoy viendo varias respuestas que no hacen frente a lo que parece pide Ziltoid, pensé que trato de aclarar lo que creo que significa .

En SQL, "WHERE col IN (1,2,3)" es aproximadamente el equivalente a "WHERE col = 1 OR col = 2 OR col = 3".

Él está buscando algo que voy a pseudo-código como

WHERE col IN_LIKE ('A%', 'TH%E', '%C') 

que sería más o menos el equivalente a

WHERE col LIKE 'A%' OR col LIKE 'TH%E' OR col LIKE '%C' 

Las respuestas expresiones regulares parecen venir más cercano; el resto parece estar fuera de lugar.

+0

¿Existe alguna manera de que nos proporcione un conjunto de muestra de tablas/registros y luego nos brinde su resultado esperado/deseado? Eso ayudaría a las personas a construir una consulta que podría servir a sus necesidades. – TheTXI

+0

¿Podría especificar RDBMS para que las personas puedan encontrar una respuesta óptima para su pregunta? Gracias. – Sung

+0

Agregué un ejemplo de los datos que estoy usando – Ziltoid

Respuesta

8

No estoy seguro de qué base de datos está utilizando, pero con Oracle podría lograr algo equivalente al aliar su subconsulta en la cláusula FROM en lugar de usarla en una cláusula IN. Usando su ejemplo:

select p.* 
from 
    (select code_wildcard 
    from second 
    where id = 1) s 
    join parent p 
     on p.office_code like s.code_wildcard 
+0

Eso fue todo. Muchas gracias. – Ziltoid

2

Puede usar una declaración LIKE para obtener una lista de ID y luego usarla en la declaración IN.

Pero no puede combinar directamente IN y LIKE.

3

Qué quiere decir somethign como:

select * FROM table where column IN (
    SELECT column from table where column like '%%' 
) 

Realmente esto debe escribirse como:

SELECT * FROM table where column like '%%' 

Utilizando una consulta de selección Sub es realmente beneficioso cuando se tiene que tirar de registros basado en un conjunto de lógica que no deseará en la consulta principal.

algo como:

SELECT * FROM TableA WHERE TableA_IdColumn IN 
(
    SELECT TableA_IdColumn FROM TableB WHERE TableA_IDColumn like '%%' 
) 

actualización a la pregunta:

No se pueden combinar con una declaración en una declaración como:

que tendrá que hacer tres diferentes como declaraciones a buscar en los diversos comodines.

+0

No. Los datos en la columna en realidad contienen comodines. – Ziltoid

+0

La consulta externa no hace nada. –

+0

Sí, lo sé, estaba trabajando para actualizar la respuesta. – kemiller2002

6

En MySQL, utilice REGEXP:

WHERE field1 REGEXP('(value1)|(value2)|(value3)') 

mismo en Oracle:

WHERE REGEXP_LIKE(field1, '(value1)|(value2)|(value3)') 
+0

No creo que los paréntesis sean necesarios. 'value1 | value2 | value3' debería hacer. No hay que olvidar que value1..n debe escaparse de acuerdo con las reglas de expresiones regulares antes de ponerlas. – Tomalak

0

que podría hacer la parte Como en una subconsulta, tal vez?

Select * A partir de la Tabla A Donde X en (Seleccionar Una de TableB donde B Al igual que '% 123%')

+0

Eso no funcionará. Los datos para la subconsulta realmente tienen comodines definidos. es decir, los datos en la columna ya dicen% 123%. – Ziltoid

0

tsql tiene la declaración contains para una mesa habilitada para búsqueda de texto completo.

CONTAINS(Description, '"sea*" OR "bread*"') 
+0

Tiene CONTIENE una tabla habilitada para búsqueda de texto completo, es decir. – Tomalak

+0

¿Pero se puede usar una subconsulta para el segundo parámetro? – Ziltoid

+0

, usted es Tomalak. No estoy seguro acerca de ese Ziltoid. – dotjoe

2

Quizás es algo como esto?

SELECT DISTINCT 
    my_column 
FROM 
    My_Table T 
INNER JOIN My_List_Of_Value V ON 
    T.my_column LIKE '%' + V.search_value + '%' 

En este ejemplo, he utilizado una tabla con los valores para simplificar, pero podría cambiarla fácilmente a una subconsulta. Si tiene una lista grande (como decenas de miles), entonces el rendimiento puede ser difícil.

0

Si estoy leyendo la pregunta correctamente, queremos que todas las filas principales que tienen un código de Office que coincida con cualquier Code_Wildcard en la "Segunda" tabla.

En Oracle, al menos, esta consulta consigue que:

SELECT * 
FROM parent, second 
WHERE office_code LIKE code_wildcard; 

Me estoy perdiendo algo?

1
select * 
    from parent 
where exists(select * 
       from second 
       where office_code like trim(code_wildcard)); 

code_wildcard ajuste en caso de que haya espacios en blanco finales.

Cuestiones relacionadas