2012-10-31 61 views
2

生成表格的file_name字段中的數據應該是一個分配號碼,然後是_01,_02或_03等,然後是.pdf(示例82617_01.pdf)。從表格數據值中間刪除一個varchar2字符串

某處,程序在分配的號碼與01,02等之間放置了州名和有時是日期/時間戳(82617_ALABAMA_01.pdf或19998_MAINE_07-31-2010_11-05-59_AM.pdf或例如5485325_OREGON_01.pdf)。

我們希望開發一個SQL語句來查找錯誤的文件名並對其進行修復。理論上,找到包含varchar2數據類型的文件名並將其刪除似乎相當簡單,但將該語句放在一起超出了我的想象。

任何幫助或建議表示讚賞。

喜歡的東西:

UPDATE GENERATION 

SET FILE_NAME (?) 

WHERE FILE_NAME (?...LIKE '%STRING%');? 

回答

2

你可以找到這樣的問題行:

select * 
from Files 
where length(FILE_NAME) - length(replace(FILE_NAME, '_', '')) > 1 

可以解決這些問題是這樣的:

update Files 
set FILE_NAME = SUBSTR(FILE_NAME, 1, instr(FILE_NAME, '_') -1) || 
    SUBSTR(FILE_NAME, instr(FILE_NAME, '_', 1, 2)) 
where length(FILE_NAME) - length(replace(FILE_NAME, '_', '')) > 1 

SQL Fiddle Example

+0

完美。 ...........花了我一些時間來掌握到底發生了什麼,但是它的工作非常棒。 –

1

你也可以我們ËRegexp_replace功能:

SQL> with t1(col) as(
    2  select '82617_mm_01.pdf' from dual union all 
    3  select '456546_khkjh_89kjh_67_01.pdf' from dual union all 
    4  select '19998_MAINE_07-31-2010_11-05-59_AM.pdf' from dual union all 
    5  select '5485325_OREGON_01.pdf' from dual 
    6 ) 
    7 select col 
    8  , regexp_replace(col, '^([0-9]+)_(.*)_(\d{2}\.pdf)$', '\1_\3') res 
    9  from t1; 

COL          RES 
-------------------------------------- ----------------------------------------- 
82617_mm_01.pdf       82617_01.pdf 
456546_khkjh_89kjh_67_01.pdf   456546_01.pdf 
19998_MAINE_07-31-2010_11-05-59_AM.pdf 19998_MAINE_07-31-2010_11-05-59_AM.pdf 
5485325_OREGON_01.pdf     5485325_01.pdf 

要顯示好壞數據regexp_like功能就會派上用場:

SQL> with t1(col) as(
    2  select '826170_01.pdf' from dual union all 
    3  select '456546_01.pdf' from dual union all 
    4  select '19998_MAINE_07-31-2010_11-05-59_AM.pdf' from dual union all 
    5  select '5485325_OREGON_01.pdf' from dual 
    6 ) 
    7 select col bad_data 
    8  from t1 
    9 where not regexp_like(col, '^[0-9]+_\d{2}\.pdf$'); 

BAD_DATA 
-------------------------------------- 
19998_MAINE_07-31-2010_11-05-59_AM.pdf 
5485325_OREGON_01.pdf 

SQL> with t1(col) as(
    2  select '826170_01.pdf' from dual union all 
    3  select '456546_01.pdf' from dual union all 
    4  select '19998_MAINE_07-31-2010_11-05-59_AM.pdf' from dual union all 
    5  select '5485325_OREGON_01.pdf' from dual 
    6 ) 
    7 select col good_data 
    8  from t1 
    9 where regexp_like(col, '^[0-9]+_\d{2}\.pdf$'); 

GOOD_DATA 
-------------------------------------- 
826170_01.pdf 
456546_01.pdf 

爲此目的,您update聲明可能是這樣的:

update your_table 
    set col = regexp_replace(col, '^([0-9]+)_(.*)_(\d{2}\.pdf)$', '\1_\3'); 
--where clause if needed 
+0

通過這個工作可能需要我一兩天,但我相信它也會爲我工作....非常感謝您的幫助! –