2012-03-21 5 views
7

Problema:SQL: SELECT La alimentación de salida que LIKE

select STR1 from T1 where STR2 = 'NAME1' 

En el STR1 consulta anterior puede estar en forma {ABC, ABC_1, ABC_2, ..., MNO, XYZ, XYZ_1 ...}.

Así que supongo que he siguiente salida

ABC_1 
MNO 
XYZ 

Ahora quiero extraer todos los STR1 juego que incluye la parte antes de _ #. Por ejemplo, la producción esperada para el conjunto de datos de ejemplo anterior es:

ABC 
ABC_1 
ABC_2 

MNO 

XYZ 
XYZ_1 

Tenga en cuenta que STR2 siempre es única por STR1.

Código sabia me imagino algo como lo siguiente:

SELECT 
    STR1 
FROM 
    T1 
WHERE 
    STR1 
LIKE '% (truncate_underscore_part(select STR1 from T1 where STR2 = 'NAME1')) %' 

Alguna idea?

Primera solución:

select t1.str1 
    from (
    select case when instr(str1, '_') > 0 
       then substr(str1, 1, instr(str1, '_') - 1) 
       else str1 
     end prefix 
    from t1 where str2 = 'NAME1' 
) prefix_list, 
    t1 
    where t1.str1 like prefix || '%' 
+3

¿Está utilizando Oracle o MySQL? –

+1

Su ejemplo del resultado de la primera consulta muestra solo elementos sin guiones bajos, pero entiendo por su descripción que la primera lista también podría incluir 'ABC_1', etc., y desea quitar la _ _ porción de la cadena antes de continuar con la coincidencia? –

+0

¿Por qué está etiquetado como Oracle y MySQL? – MatBailie

Respuesta

1
with prefix_list as (
    select regexp_substr(str1, '^[A-Z]*') prefix from t1 where str2 = 'NAME1' 
) 
select t1.str1 from t1 join prefix_list 
     on t1.str1 = prefix_list.prefix 
      or regexp_like(t1.str1, prefix_list.prefix||'_[0-9]') 

hacerlo sin las funciones de expresiones regulares (para versiones anteriores de Oracle), depende un poco de cuánto quiere validar el formato de las cadenas.

select t1.str1 
    from (
    select case when instr(str1, '_') > 0 
       then substr(str1, 1, instr(str1, '_') - 1) 
       else str1 
     end prefix 
    from t1 where str2 = 'NAME1' 
) prefix_list, 
    t1 
where t1.str1 = prefix 
    or t2.str1 like prefix || '\__' escape '\' 
+0

Error de ejecución en TOAD: operador relacional no válido – LovelyVirus

+0

Lo siento, no hago TOAD. Pruebe SQLPlus o SQL Developer. –

+0

Es un error de Oracle independientemente de TOAD, sqlplus. Probé con ambos. – LovelyVirus

0

Una forma de hacerlo es con un auto-unirse.

He aquí un ejemplo para MySQL:

SELECT t2.str1 
FROM t1 
    INNER JOIN T1 as t2 on (t2.str1 = t1.str1 OR t2.str1 LIKE CONCAT(t1.str1,'\_%')) 
WHERE t1.STR2 = 'NAME1' 

Y aquí es un intento de traducir eso a la sintaxis de Oracle:

SELECT t2.str1 
FROM t1 
    INNER JOIN T1 as t2 on (t2.str1 = t1.str1 OR t2.str1 LIKE t1.str1 || '\_%') 
WHERE t1.STR2 = 'NAME1' 
+0

error: falta la palabra clave. ¿Qué podría ser? – LovelyVirus

+0

Mi respuesta fue para MySQL ya que su pregunta fue originalmente etiquetada como MySQL. Trataré de traducirlo a Oracle. –

+0

Perdón por las etiquetas. Independientemente del mismo error nuevamente (cursor en 'como'). – LovelyVirus

0

En Oracle, me gustaría utilizar

where regexp_like(str1, '[A-Z]{3}(_[0-9]+)?')