2016-07-21 11 views
0

Ich habe Aufzeichnungen wie ...Oracle - Zahl Datensätze, wenn Anzahl der Token weniger als 2

ID | KEY 
-------|--------- 
    1 | 123_456_abc 
    1 | 123_xyz 
    1 | 456_abc 
    2 | 123_abc 
    2 | 122_73_zcc 
    3 | 123_wer 
    4 | 345_23_fhd 
    4 | 3453_abc 
    5 | ad1fr2h3_abcasd 
    5 | ers2g45bb_abc2rtd 
    5 | asf23g_abc1_sf45 

Ich möchte count(ID) where count(tokanize(numeric(KEY),'_')) < 2

als Graf (ID) wird 6

+0

so, was Sie brauchen die Anzahl der Datensätze, in denen <2 '_' Zeichen in der Spalte' key' stehen. richtig? –

+0

ja, aber Schlüssel sollte nur für numerischen Wert Tokanize – Cool

+0

Ist die Anzahl der Elemente in der KEY-Liste Variable auf mehr als 3 Elemente wie gezeigt? Könnten die Nummern in dieser Liste in irgendeiner Position sein? –

Antwort

0

Sie können versuchen, etwas wie das

SELECT COUNT(ID) FROM xyz WHERE key NOT LIKE '%_%_%'; 

Dies sollte alle Elemente filtern, die weniger als zwei Unterstriche.

+0

es wäre Teillösung, da ich zählen möchte (id), wo numerische Token zählen weniger als 2 ist, da es einige Datensätze wie ad1fr2h3_abc1asd, ers2g45bb_abc2rtd, asf23g_abc1_sf45 – Cool

+0

@Cool - bitte fügen Sie diese Testaufzeichnungen zu Ihrem ursprünglichen Post dann. –

+0

yup .. hinzugefügt diese ..! – Cool

0

beseitigen alle Datensätze, die mehr als 1 hat, unterstreicht dann diejenigen beseitigen, die mit einer Zahl beginnen nicht es dann

select sum(cnt) from (
select key, cnt, id from (
select key, length(regexp_replace(key,'[^_]*','')) cnt, id from table_name 
) where cnt < 2 

) where regexp_like(key,'[1-9]+(.)*') 
0

zusammenzufassen Versuchen Sie folgendes:

select Count(1) from 
(with abc(id,key) as (select '1','123_456_abc' from dual 
        Union all 
        select '1','123_xyz' from dual 
        UNion all 
        select '1','456_abc' from dual 
        Union all 
        select '2','123_abc' from dual 
        UNion all 
        select '2','123_73_zcc' from dual 
        Union all 
        select '3','123_wer' from dual 
        UNion all 
        select '1','345_23_fhd' from dual 
        UNion all 
        select '1','345_abc' from dual 

) 
select key, length(regexp_replace(key,'[^_]*','')) cntr 
from abc) 
where cntr = 1