2012-10-01 9 views
5

Me gustaría encontrar todas las filas cuyo valor de columna comienza con un dígito.Oracle SQL: columna de búsqueda que comienza con los dígitos

Su funciona bien con esta solicitud:

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

pero es demasiado largo.

Gracias por su ayuda.

+1

use [LIKE] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions007.htm), es exactamente por esto – Yaroslav

Respuesta

1

intenta utilizar 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 sería muy útil y mucho más corto

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

o el uso de la clase de caracteres

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

BETWEEN es todo lo que necesita! (! NOT NULL está implícita en este caso)

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

Si usted tiene un índice en esa columna, y no les importa la pequeña dirtyness de esta solución, incluso se puede acelerarlo:

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

Esto supone que NO_ART_TECH_OI no contiene caracteres con el código ascii> 126.

Cuestiones relacionadas