網站首頁 編程語言 正文
字符串的合并
在Oracle中可能有多種實現方法,目前我已知的有兩種,下面記錄下這兩種的實現:
字符串合并方法一:
實現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;
執行結果:
SQL分析:
利用Oracle自帶的wm_concat()函數將字符串合并,這里有個缺點,合并的連接符號只能為默認的逗號,不能用其他符號。
字符串合并方法二:
實現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;
執行結果:
SQL分析:
利用Oracle自帶的LISTAGG()函數將字符串合并,它的優點在于,合并的連接符號可以指定為任意字符,并且可以很方便實現ORDER BY排序。
字符串的拆分
在Oracle中可能有多種實現方法,目前我已知的有兩種,下面記錄下這兩種的實現:
字符串拆分方法一:
實現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;
執行結果:
SQL分析:
這個語句稍微有些復雜,下面分步驟進行說明:
首先看下movies表的原始數據:?
1.第一步是將class字段的值根據分隔符(此處為頓號)進行初步拆分,拆分為兩個部分。第一部分為class字段要拆分的第一個值,第二部分為class字段要拆分的其余部分的值。
2.第二步利用WITH表達式實現遞歸查詢,根據分隔符(此處為頓號)循環將第一步操作中未拆分的值(第二部分)進行拆分,一直拆分到字段的最后一個分割符為止,遞歸結束的數據放在臨時表t中。
?3.第三步是一個簡單的查詢,從第二步的臨時表t中查詢記錄并排序。
字符串拆分方法二:
實現SQL:
--方法二
SELECT m.name,t.column_value FROM movies m,TABLE(SPLIT(m.class,'、')) t;
執行結果:
SQL分析:
這種方法其實是通過自定義一個函數(function)來處理字符串,函數split的邏輯其實跟方法一的邏輯差不多,都是用到了遞歸,將字符串中的值根據分隔符一次一次拆分,最終返回拆分后的字符串。這種方法個人感覺更好一些,因為是將拆分邏輯進行了封裝,使用起來更簡單,邏輯更清晰。
下面是split函數的創建腳本:
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;
函數的返回值類型tabletype也是自定義的一個類型。
下面是該類型的創建腳本:
create or replace type tabletype as table of varchar2(32676);
總結
原文鏈接:https://blog.csdn.net/liangmengbk/article/details/124227569
相關推薦
- 2022-01-25 項目啟動的時候報Exception in thread main 錯誤解決方法
- 2022-03-28 用python實現超強的加密軟件_python
- 2022-05-05 Tomcat使用https配置實戰教程_Tomcat
- 2023-03-01 Python開根號的幾種方式詳解_python
- 2022-03-14 Failed to load ApplicationContext異常的解決思路
- 2024-04-03 @ExceptionHandler沒有報錯詳細信息
- 2022-06-09 Redis超詳細講解高可用主從復制基礎與哨兵模式方案_Redis
- 2022-05-19 pytorch中的?.view()函數的用法介紹_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支