2012-10-01 29 views
5

Tôi muốn tìm tất cả các hàng có giá trị cột bắt đầu bằng một chữ số.Oracle SQL: cột tìm kiếm bắt đầu bằng các chữ số

nó hoạt động tốt với yêu cầu này:

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

Nhưng nó quá dài.

Cảm ơn sự giúp đỡ của bạn.

+1

sử dụng [LIKE] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/conditions007.htm), chính xác cho điều này – Yaroslav

Trả lời

1

Cố gắng sử dụng 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 sẽ có ích và ngắn hơn nhiều

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

hoặc sử dụng nhân vật lớp

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

BETWEEN là tất cả bạn cần! (! NOT NULL là tiềm ẩn trong trường hợp này)

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

Nếu bạn có một chỉ mục trên cột đó, và không nhớ những dirtyness ít dung dịch này, bạn thậm chí có thể tăng tốc độ nó lên:

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

Điều này giả định rằng NO_ART_TECH_OI không chứa các ký tự có mã ascii> 126.

Các vấn đề liên quan