網(wǎng)站首頁 編程語言 正文
字符串的合并
在Oracle中可能有多種實現(xiàn)方法,目前我已知的有兩種,下面記錄下這兩種的實現(xiàn):
字符串合并方法一:
實現(xiàn)SQL:
--方法一
SELECT d.dept_name,wm_concat(e.emp_name) FROM employee e
INNER JOIN department d ON d.dept_id=e.dept_id
GROUP BY d.dept_name;
執(zhí)行結果:
SQL分析:
利用Oracle自帶的wm_concat()函數(shù)將字符串合并,這里有個缺點,合并的連接符號只能為默認的逗號,不能用其他符號。
字符串合并方法二:
實現(xiàn)SQL:
--方法二
SELECT d.dept_name,
LISTAGG (e.emp_name, ',') WITHIN GROUP (ORDER BY e.emp_name) names
FROM employee e
INNER JOIN department d ON d.dept_id=e.dept_id
GROUP BY d.dept_name;
執(zhí)行結果:
SQL分析:
利用Oracle自帶的LISTAGG()函數(shù)將字符串合并,它的優(yōu)點在于,合并的連接符號可以指定為任意字符,并且可以很方便實現(xiàn)ORDER BY排序。
字符串的拆分
在Oracle中可能有多種實現(xiàn)方法,目前我已知的有兩種,下面記錄下這兩種的實現(xiàn):
字符串拆分方法一:
實現(xiàn)SQL:
--方法一
WITH t (id, name, sub, str) AS (
SELECT id, name, substr(class, 1, instr(class, '、')-1), substr(concat(class,'、'), instr(class, '、')+1)
FROM movies
UNION ALL
SELECT id, name,substr(str, 1, instr(str, '、')-1), substr(str, instr(str, '、')+1)
FROM t WHERE instr(str, '、')>0
)
SELECT id, name, sub
FROM t
ORDER BY id;
執(zhí)行結果:
SQL分析:
這個語句稍微有些復雜,下面分步驟進行說明:
首先看下movies表的原始數(shù)據(jù):?
1.第一步是將class字段的值根據(jù)分隔符(此處為頓號)進行初步拆分,拆分為兩個部分。第一部分為class字段要拆分的第一個值,第二部分為class字段要拆分的其余部分的值。
2.第二步利用WITH表達式實現(xiàn)遞歸查詢,根據(jù)分隔符(此處為頓號)循環(huán)將第一步操作中未拆分的值(第二部分)進行拆分,一直拆分到字段的最后一個分割符為止,遞歸結束的數(shù)據(jù)放在臨時表t中。
?3.第三步是一個簡單的查詢,從第二步的臨時表t中查詢記錄并排序。
字符串拆分方法二:
實現(xiàn)SQL:
--方法二
SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;
執(zhí)行結果:
SQL分析:
這種方法其實是通過自定義一個函數(shù)(function)來處理字符串,函數(shù)split的邏輯其實跟方法一的邏輯差不多,都是用到了遞歸,將字符串中的值根據(jù)分隔符一次一次拆分,最終返回拆分后的字符串。這種方法個人感覺更好一些,因為是將拆分邏輯進行了封裝,使用起來更簡單,邏輯更清晰。
下面是split函數(shù)的創(chuàng)建腳本:
create or replace function split (p_list clob, p_sep varchar2 := ',')
return tabletype
pipelined
is
l_idx pls_integer;
v_list varchar2 (32676) := to_char(p_list);
begin
loop
l_idx := instr (v_list, p_sep);
if l_idx > 0
then
pipe row (substr (v_list, 1, l_idx - 1));
v_list := substr (v_list, l_idx + length (p_sep));
else
pipe row (v_list);
exit;
end if;
end loop;
end;
函數(shù)的返回值類型tabletype也是自定義的一個類型。
下面是該類型的創(chuàng)建腳本:
create or replace type tabletype as table of varchar2(32676);
總結
原文鏈接:https://blog.csdn.net/liangmengbk/article/details/124227569
相關推薦
- 2022-04-02 Python數(shù)據(jù)結構之雙向鏈表詳解_python
- 2022-10-31 Kotlin中Object關鍵字的使用示例介紹_Android
- 2022-04-05 Python中hash加密簡介及使用方法_python
- 2022-05-15 C++設計模式中的觀察者模式一起來看看_C 語言
- 2022-05-25 C語言中操作字符串的函數(shù)詳解_C 語言
- 2022-12-05 Django中使用AJAX的詳細過程_python
- 2022-05-23 一起來學習C++的函數(shù)指針和函數(shù)對象_C 語言
- 2022-10-14 VSCode連接實驗室服務器Xshell,Xftp向服務器傳輸文件的方法(win10)_Linux
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支