f 處理Oracle 內的日期garbage data ~ 迪貝之家

處理Oracle 內的日期garbage data

 

在前一家公司的職務是維運的dba
採用golden gate升級移轉10g到18c時
專案負責人有來要求清理garbage data
當時以不是專案scope來回絕
開玩笑....幾億筆的資料
我又不是你單位的人
光做個golden gate implement
我就忙死了,而且手上又不是只有一個專案
答應的話, 我就不用休息睡覺了
現在dedicate在一個政府的系統功能升級標案
雖然說是DBA,不過坦白說9成以上的工作在寫轉檔資料的程式
一定會碰到garbage data
只能處理,避不掉的..........
算分隔符號出現幾次
select REGEXP_COUNT('2003/05/29', '/') from dual
類似Perl 的split , 拆解各elements
select regexp_substr('2003/05-29', '[^/-]+', 1, 1) as grupo_1
,regexp_substr('2003-05/29', '[^/-]+', 1, 2) as grupo_2
,regexp_substr('2003/05/29', '[^/-]+', 1, 3) as grupo_3
from dual;
[^/-]
1.非 / 或 -
2.+ 一或多次出現
驗測是否為數字
case when regexp_like(ur_col, '^\d+(\.\d+)?$')
then 'numeric'
else 'not number'
end





怎麼清掉unicode的空白(0020)
眼前的工作最大的價值
看起來就是在幫客戶清理及整理資料
做起來實在是有夠嘔的.........
SELECT 
CASE WHEN trim(ur_col) = '0' then null else rawtohex(ur_col) end ccc,
length(ur_col) as length,
lengthb(ur_col) as lengthb,
rtrim(ur_col,unistr('\0020')) rtrim_special,
length(rtrim(ur_col,unistr('\0020'))) rtrim_special_length,
lengthb(rtrim(ur_col,unistr('\0020'))) rtrim_special_lengthb
FROM T2



我要截取2012/1/18 上午 12:00:00的後半段
然後再組合存成date
被這些資料給搞死
真是一個資料,各自表述
select regexp_replace('2012/1/18 上午 12:00:00',regexp_substr('2012/1/18 上午 12:00:00', '[^ ]+', 1, 1),'')  from dual;





update town
set name = regexp_replace(name,'臺','台')
where regexp_like(name,'^臺.[縣|市]'); <- 臺開頭,空一個任何字元, 第三個字是縣或市
update county
set name = regexp_replace(name,'臺','台')
where regexp_like(name,'臺');

string包含小寫:
where regexp_like(ANSWER,'[a-z]')
or 
where regexp_like(ANSWER,'[:lower:]')
兩者差異
前者是至少一個字元,後者僅一個字元
兩者要一致
 regexp_like(ANSWER,'[[:lower:]]')