2012-10-01 22 views
5

Mi piacerebbe trovare tutte le righe che il valore della colonna inizia con una cifra.Oracle SQL: colonna di ricerca che inizia con le cifre

sua funziona bene con questa richiesta:

WHERE trim(u_ods_val3.ods_itn_PHRSBMO.NO_ART_TECH_OI) IS NOT NULL 
    AND (SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1)='0' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='1' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='2 ' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='3' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='4' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='5' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='6' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='7' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='8' 
    OR SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) ='9') 

ma è troppo lungo.

Grazie per il vostro aiuto.

+1

utilizza [LIKE] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions007.htm), è esattamente per questo – Yaroslav

risposta

1

tenta di utilizzare in:

WHERE trim(u_ods_val3.ods_itn_PHRSBMO.NO_ART_TECH_OI) IS NOT NULL 
    AND SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) in ('0','1','2','3','4','5','6','7','8','9') 
18

Regexp_like sarebbe utile e molto più breve

where regexp_like(trim(col_name), '^[0-9]') 

o utilizzando classe di caratteri

where regexp_like(trim(col_name), '^[[:digit:]]') 
1

BETWEEN è tutto ciò che serve! (! NOT NULL è implicita in questo caso)

WHERE SUBSTR(u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI,0,1) between '0' and '9' 

Se si dispone di un indice su quella colonna, e non mente la piccola dirtyness di questa soluzione, si può anche accelerarlo:

WHERE u_ods_val3.ODS_ITN_PHRSBMO.NO_ART_TECH_OI between '0' and '9~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' 

Ciò presuppone che NO_ART_TECH_OI non contenga caratteri con codice ascii> 126.