2012-03-21 26 views
7

Sorun GİBİ için: şeklinde olabilir Yukarıdaki sorgu STR1 olarakSQL: Feeding SEÇ çıkış

select STR1 from T1 where STR2 = 'NAME1' 

{ABC, ABC_1, ABC_2, ..., MNO, XYZ, XYZ_1 ...}.

Yani Şimdi önce bir kısmını içeren tüm bu eşleşen dizge1 ayıklamak istiyorum

ABC_1 
MNO 
XYZ 

çıktı üretmesi aşağıdakilere sahip varsayalım _ #. Örneğin yukarıdaki örnek veri kümesi için beklenen çıktısı: dizge2'den hep STR1 başına tektir

ABC 
ABC_1 
ABC_2 

MNO 

XYZ 
XYZ_1 

Not.

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

herhangi bir fikir:

Kod akıllıca aşağıdaki gibi bir şey hayal?

İlk çözüm: Bir iç birleşim ile bunu yapmak

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

Eğer Oracle kullanarak, yoksa mySql kullanırdınız? –

+1

İlk sorgudaki çıktının örneğiniz yalnızca alt çizgilerini içermeyen öğeleri gösterir, ancak açıklamanızdan, ilk listenin 'ABC_1' vb. Içerebileceğini ve _ # bölümünü kesmek istediğinizi anlıyor musunuz? eşleşen ile devam etmeden önce dize? –

+0

Bu neden hem Oracle hem de MySQL olarak etiketlendi ??? – MatBailie

cevap

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

eski Oracle sürümleri için (regexp işlevleri olmadan bunu yapmak için), dizelerin biçimini ne kadar doğrulamak istediğinize bağlıdır.

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

TOAD içinde yürütme hatası: Geçersiz ilişkisel işleç – LovelyVirus

+0

Üzgünüm, TOAD yapmıyorum. SQLPlus veya SQL Developer'ı deneyin. –

+0

TOAD, sqlplus'a bakmaksızın Oracle hatası var. İkisini de denedim. – LovelyVirus

0

Tek yoldur. bir girişim Oracle sözdizimi Bunu çevirmek oluyor burada

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' 

Ve: İşte

bir MySQL için örnek

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

hata: anahtar kelime eksik. Ne olabilirdi? – LovelyVirus

+0

Cevabım MySQL içindi çünkü sorunuz orijinal olarak MySQL olarak etiketlendi. Onu Oracle'a çevirmeyi deneyeceğim. –

+0

Etiketler için üzgünüm. Yine aynı hataya tekrar (imleç 'olarak'). – LovelyVirus

0

Oracle, ben

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