2012-03-21 30 views
7

Problema:SQL: Alimentazione Output Select a come

select STR1 from T1 where STR2 = 'NAME1' 

Nella sopra STR1 query può essere in forma {ABC, ABC_1, ABC_2, ..., MNO, XYZ, XYZ_1 ...}.

Quindi suppongo che ho seguente output

ABC_1 
MNO 
XYZ 

Ora voglio estrarre tutti quelli corrispondenti STR1 che includono la parte prima _ #. Per esempio i risultati attesi per l'esempio set di dati di cui sopra è:

ABC 
ABC_1 
ABC_2 

MNO 

XYZ 
XYZ_1 

Nota che STR2 è sempre unico per ogni STR1.

Codice saggio immagino qualche cosa come segue:

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

Qualche idea?

Prima soluzione:

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

Si sta utilizzando Oracle o MySQL? –

+1

L'esempio dell'output della prima query mostra solo gli elementi senza sottolineatura, ma dalla tua descrizione ho compreso che il primo elenco potrebbe includere "ABC_1", ecc., E si desidera rimuovere la porzione _ # di la stringa prima di procedere con la corrispondenza? –

+0

Perché questo è etichettato come Oracle e MySQL ??? – MatBailie

risposta

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]') 

di farlo senza le funzioni regexp (per le versioni precedenti di Oracle), dipende un po 'da quanto si vuole convalidare il formato delle stringhe.

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

Errore di esecuzione in TOAD: operatore relazionale non valido – LovelyVirus

+0

Mi dispiace, non lo faccio. Prova SQLPlus o SQL Developer. –

+0

È un errore oracle indipendentemente da TOAD, sqlplus. Ho provato su entrambi. – LovelyVirus

0

Un modo per farlo è con un self-join.

Ecco un esempio per 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' 

Ed ecco un tentativo di tradurre che per la sintassi 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

: parola chiave mancante. Cosa potrebbe essere? – LovelyVirus

+0

La mia risposta era per MySQL poiché la tua domanda era originariamente etichettata come MySQL. Proverò a tradurlo in Oracle. –

+0

Ci scusiamo per i tag. Indipendentemente dallo stesso errore (cursore su "come"). – LovelyVirus

0

In Oracle, vorrei utilizzare

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