2

生成テーブルのフィールドのデータはfile_name、割り当てられた番号、_01、_02、または _03 の順に続く必要があります.pdf(例 82617_01.pdf)。

プログラムは、割り当てられた番号と 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%');?
4

2 に答える 2

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 フィドルの例

于 2012-10-31T15:01:20.750 に答える
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
于 2012-10-31T15:04:18.570 に答える