【Oracle】 sql 中的字元(串)替換與轉換
1、REPLACE
語法:REPLACE(char, search_string,replacement_string)
用法:將char中的字串search_string全部轉換為字串replacement_string。
舉例:SQL> select REPLACE('fgsgswsgs', 'fk' ,'j') 返回值 from dual;
返回值
---------
fgsgswsgs
SQL> select REPLACE('fgsgswsgs', 'sg
返回值
-----------------------
fgeeerrrtttsweeerrrttts
分析:第一個例子中由於'fgsgswsgs'中沒有與'fk'匹配的字串,故返回值仍然是'fgsgswsgs';
第二個例子中將'fgsgswsgs'中的字串'sg'全部轉換為'eeerrrttt'。
2、TRANSLATE
語法:TRANSLATE(char, from, to)
用法:返回將出現在from中的每個字元替換為to中的相應
若from比to字串長,那麼在from中比to中多出的字元將會被刪除。
三個引數中有一個是空,返回值也將是空值。
舉例:SQL> select translate('abcdefga','abc','wo')
返回值 from dual;
返回值
-------
wodefgw
分析:該語句要將'abcdefga'中的'abc'轉換為'wo',
由於'abc'中'a'對應'wo'中的'w',故將'abcdefga'中的'a'全部轉換成'w';
而'abc'中'b'對應'wo'中的'o',故將'abcdefga'中的'b'全部轉換成'o';
'abc'中的'c'在'wo'中沒有與之對應的字元,故將'abcdefga'中的'c'全部刪除;
簡單說來,就是將from中的字元轉換為to中與之位置對應的字元,若to中找不到與之對應的字元,返回值中的該字元將會被刪除。
在實際的業務中,可以用來刪除一些異常資料,比如表a中的一個欄位t_no表示電話號碼,而電話號碼本身應該是一個由數字組成的字串,為了刪除那些含有非數字的異常資料,就用到了translate函式:
舉例:SQL> delete from a
where length(translate(trim(a.t_no),
'0123456789' || a.t_no,
'0123456789')) <> length(trim(a.t_no));
3、DECODE
語法:DECODE(expression, search_1, result_1, search_2, result_2, ...., search_n, result_n)
DECODE(expression, search_1, result_1, search_2, result_2, ...., search_n, result_n, default)
用法:比較表示式和搜尋字,如果匹配,返回結果;
如果不匹配,返回default值;
如果未定義default值,則返回空值。
含義如下:
IF expression=search_1 THEN
RETURN(result_1);
ELSE IF expression=search_2 THEN
RETURN(result_2);
......
ELSE IF expression=search_n THEN
RETURN(result_n);
ELSE
IF ISEXIXT(default)
RETURN(default);
ELSE
RETURN(NULL);
END IF;
舉例:SQL> select checkup_person 投票人,
decode(checkup_result,’Y’,’贊同票’,’N’,’反對票’,NULL,’棄權票’,’無效票’) 投票結果
FROM checkup;
分析:該語句要checkup表中的checkup_result欄位進行翻譯,
將‘Y’翻譯為‘贊同票’;
將’N’翻譯為’反對票’;
將NULL翻譯為’棄權票’;
預設值是’無效票’。
4、Oracle 格式化函式 to_char To_date To_number
格式化函式提供一套有效的工具用於把各種資料型別(日期/時間,int,float,numeric)轉換成格式化的字串以及反過來從格式化的字串轉換成原始的資料型別。
注意:所有格式化函式的第二個引數是用於轉換的模板。
4-1、格式化函式
函式 | 返回 | 描述 | 例子 |
---|---|---|---|
to_char(timestamp, text) | text | 把 timestamp 轉換成 string | to_char(timestamp 'now','HH12:MI:SS') |
to_char(int, text) | text | 把 int4/int8 轉換成 string | to_char(125, '999') |
to_char(float, text) | text | 把 float4/float8 轉換成 string | to_char(125.8, '999D9') |
to_char(numeric, text) | text | 把 numeric 轉換成 string | to_char(numeric '-125.8', '999D99S') |
to_date(text, text) | date | 把 string 轉換成 date | to_date('05 Dec 2000', 'DD Mon YYYY') |
to_timestamp(text, text) | date | 把 string 轉換成 timestamp | to_timestamp('05 Dec 2000', 'DD Mon YYYY') |
to_number(text, text) | numeric | 把 string 轉換成 numeric | to_number('12,454.8-', '99G999D9S') |
4-2、用於 date/time 轉換的模板
模板 | 描述 |
---|---|
HH | 一天的小時數 (01-12) |
HH12 | 一天的小時數 (01-12) |
HH24 | 一天的小時數 (00-23) |
MI | 分鐘 (00-59) |
SS | 秒 (00-59) |
SSSS | 午夜後的秒 (0-86399) |
AM or A.M. or PM or P.M. | 正午標識(大寫) |
am or a.m. or pm or p.m. | 正午標識(小寫) |
Y,YYY | 帶逗號的年(4 和更多位) |
YYYY | 年(4和更多位) |
YYY | 年的後三位 |
YY | 年的後兩位 |
Y | 年的最後一位 |
BC or B.C. or AD or A.D. | 年標識(大寫) |
bc or b.c. or ad or a.d. | 年標識(小寫) |
MONTH | 全長大寫月份名(9字元) |
Month | 全長混合大小寫月份名(9字元) |
month | 全長小寫月份名(9字元) |
MON | 大寫縮寫月份名(3字元) |
Mon | 縮寫混合大小寫月份名(3字元) |
mon | 小寫縮寫月份名(3字元) |
MM | 月份 (01-12) |
DAY | 全長大寫日期名(9字元) |
Day | 全長混合大小寫日期名(9字元) |
day | 全長小寫日期名(9字元) |
DY | 縮寫大寫日期名(3字元) |
Dy | 縮寫混合大小寫日期名(3字元) |
dy | 縮寫小寫日期名(3字元) |
DDD | 一年裡的日子(001-366) |
DD | 一個月裡的日子(01-31) |
D | 一週裡的日子(1-7;SUN=1) |
W | 一個月裡的週數 |
WW | 一年裡的週數 |
CC | 世紀(2 位) |
J | Julian 日期(自公元前4712年1月1日來的日期) |
Q | 季度 |
RM | 羅馬數字的月份(I-XII;I=JAN)-大寫 |
rm | 羅馬數字的月份(I-XII;I=JAN)-小寫 |
(所有模板都都允許使用字首和字尾修改器。模板裡總是允許使用修改器。字首 'FX' 只是一個全域性修改器)
4-3、用於日期/時間模板 to_char() 的字尾
字尾 | 描述 | 例子 |
---|---|---|
FM | 填充模式字首 | FMMonth |
TH | 大寫順序數字尾 | DDTH |
th | 小寫順序數字尾 | DDTH |
FX | 固定模式全域性選項(見下面) | FX Month DD Day |
SP | 拼寫模式(還未實現) | DDSP |
用法須知:
a、如果沒有使用 FX 選項,to_timestamp 和 to_date 忽略空白。FX 必須做為模板裡的第一個條目宣告。
b、反斜槓("\")必須用做雙反斜槓("\\"),例如 '\\HH\\MI\\SS'。
c、雙引號('"')之間的字串被忽略並且不被分析。如果你想向輸出寫雙引號,你必須在雙引號前面放置一個雙反斜槓('\\'),例如 '\\"YYYY Month\\"'。
d、to_char 支援不帶前導雙引號('"')的文字,但是在雙引號之間的任何字串會被迅速處理並且還保證不會被當作模板關鍵字解釋(例如:'"Hello Year: "YYYY')。
4-4、用於 to_char(numeric) 的模板
模板 | 描述 |
---|---|
9 | 帶有指定位數的值 |
0 | 前導零的值 |
. (句點) | 小數點 |
, (逗號) | 分組(千)分隔符 |
PR | 尖括號內負值 |
S | 帶負號的負值(使用本地化) |
L | 貨幣符號(使用本地化) |
D | 小數點(使用本地化) |
G | 分組分隔符(使用本地化) |
MI | 在指明的位置的負號(如果數字 < 0) |
PL | 在指明的位置的正號(如果數字 > 0) |
SG | 在指明的位置的正/負號 |
RN | 羅馬數字(輸入在 1 和 3999 之間) |
TH or th | 轉換成序數 |
V | 移動 n 位(小數)(參閱註解) |
EEEE | 科學記數。現在不支援。 |
用法須知:
a、使用 'SG','PL' 或 'MI' 的帶符號字並不附著在數字上面;例如,to_char(-12, 'S9999') 生成 ' -12',而 to_char(-12, 'MI9999') 生成 '- 12'。Oracle裡的實現不允許在 9 前面使用 MI,而是要求 9 在 MI 前面。
b、PL,SG,和 TH 是 Postgres 擴充套件。
c、9 表明一個與在 9 字串裡面的一樣的數字位數。如果沒有可用的數字,那麼使用一個空白(空格)。
d、TH 不轉換小於零的值,也不轉換小數。TH 是一個 Postgres 擴充套件。
e、V 方便地把輸入值乘以 10^n,這裡 n 是跟在 V 後面的數字。to_char 不支援把 V 與一個小數點綁在一起使用(例如. "99.9V99" 是不允許的)。
4-5、to_char 例子
輸入 | 輸出 |
---|---|
to_char(now(),'Day, HH12:MI:SS') | 'Tuesday , 05:39:18' |
to_char(now(),'FMDay, HH12:MI:SS') | 'Tuesday, 05:39:18' |
to_char(-0.1,'99.99') | ' -.10' |
to_char(-0.1,'FM9.99') | '-.1' |
to_char(0.1,'0.9') | ' 0.1' |
to_char(12,'9990999.9') | ' 0012.0' |
to_char(12,'FM9990999.9') | '0012' |
to_char(485,'999') | ' 485' |
to_char(-485,'999') | '-485' |
to_char(485,'9 9 9') | ' 4 8 5' |
to_char(1485,'9,999') | ' 1,485' |
to_char(1485,'9G999') | ' 1 485' |
to_char(148.5,'999.999') | ' 148.500' |
to_char(148.5,'999D999') | ' 148,500' |
to_char(3148.5,'9G999D999') | ' 3 148,500' |
to_char(-485,'999S') | '485-' |
to_char(-485,'999MI') | '485-' |
to_char(485,'999MI') | '485' |
to_char(485,'PL999') | '+485' |
to_char(485,'SG999') | '+485' |
to_char(-485,'SG999') | '-485' |
to_char(-485,'9SG99') | '4-85' |
to_char(-485,'999PR') | '<485>' |
to_char(485,'L999') | 'DM 485 |
to_char(485,'RN') | ' CDLXXXV' |
to_char(485,'FMRN') | 'CDLXXXV' |
to_char(5.2,'FMRN') | V |
to_char(482,'999th') | ' 482nd' |
to_char(485, '"Good number:"999') | 'Good number: 485' |
to_char(485.8,'"Pre-decimal:"999" Post-decimal:" .999') | 'Pre-decimal: 485 Post-decimal: .800' |
to_char(12,'99V999') | ' 12000' |
to_char(12.4,'99V999') | ' 12400' |
to_char(12.45, '99V9') | ' 125' |
注意:
1.在使用Oracle的to_date函式來做日期轉換時,可能會直覺地採用“yyyy-MM-dd HH:mm:ss”的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810 格式程式碼出現兩次”。如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;原因是SQL中不區分大小寫,MM和mm被認為是相同的格式程式碼,所以Oracle的SQL採用了mi代替分鐘。select to_date('2005-01-01
13:14:20','yyyy-MM-dd HH24:mi:ss') from dual;
2.另要以24小時的形式顯示出來要用HH24
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;//mi是分鐘
select to_char(sysdate,'yyyy-MM-dd HH24:mm:ss') from dual;//mm會顯示月份