系列文章目錄
【SQL開發(fā)實戰(zhàn)技巧】系列(一):關(guān)于SQL不得不說的那些事
【SQL開發(fā)實戰(zhàn)技巧】系列(二):簡單單表查詢
【SQL開發(fā)實戰(zhàn)技巧】系列(三):SQL排序的那些事
【SQL開發(fā)實戰(zhàn)技巧】系列(四):從執(zhí)行計劃討論UNION ALL與空字符串&UNION與OR的使用注意事項
【SQL開發(fā)實戰(zhàn)技巧】系列(五):從執(zhí)行計劃看IN、EXISTS 和 INNER JOIN效率,我們要分場景不要死記網(wǎng)上結(jié)論
【SQL開發(fā)實戰(zhàn)技巧】系列(六):從執(zhí)行計劃看NOT IN、NOT EXISTS 和 LEFT JOIN效率,記住內(nèi)外關(guān)聯(lián)條件不要亂放
【SQL開發(fā)實戰(zhàn)技巧】系列(七):從有重復數(shù)據(jù)前提下如何比較出兩個表中的差異數(shù)據(jù)及對應條數(shù)聊起
【SQL開發(fā)實戰(zhàn)技巧】系列(八):聊聊如何插入數(shù)據(jù)時比約束更靈活的限制數(shù)據(jù)插入以及怎么一個insert語句同時插入多張表
【SQL開發(fā)實戰(zhàn)技巧】系列(九):一個update誤把其他列數(shù)據(jù)更新成空了?Merge改寫update!給你五種刪除重復數(shù)據(jù)的寫法!
【SQL開發(fā)實戰(zhàn)技巧】系列(十):從拆分字符串、替換字符串以及統(tǒng)計字符串出現(xiàn)次數(shù)說起
【SQL開發(fā)實戰(zhàn)技巧】系列(十一):拿幾個案例講講translate|regexp_replace|listagg|wmsys.wm_concat|substr|regexp_substr常用函數(shù)
【SQL開發(fā)實戰(zhàn)技巧】系列(十二):三問(如何對字符串字母去重后按字母順序排列字符串?如何識別哪些字符串中包含數(shù)字?如何將分隔數(shù)據(jù)轉(zhuǎn)換為多值IN列表?)
【SQL開發(fā)實戰(zhàn)技巧】系列(十三):討論一下常用聚集函數(shù)&通過執(zhí)行計劃看sum()over()對員工工資進行累加
【SQL開發(fā)實戰(zhàn)技巧】系列(十四):計算消費后的余額&計算銀行流水累計和&計算各部門工資排名前三位的員工
【SQL開發(fā)實戰(zhàn)技巧】系列(十五):查找最值所在行數(shù)據(jù)信息及快速計算總和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
【SQL開發(fā)實戰(zhàn)技巧】系列(十六):數(shù)據(jù)倉庫中時間類型操作(初級)日、月、年、時、分、秒之差及時間間隔計算
【SQL開發(fā)實戰(zhàn)技巧】系列(十七):數(shù)據(jù)倉庫中時間類型操作(初級)確定兩個日期之間的工作天數(shù)、計算—年中周內(nèi)各日期出現(xiàn)次數(shù)、確定當前記錄和下一條記錄之間相差的天數(shù)
【SQL開發(fā)實戰(zhàn)技巧】系列(十八):數(shù)據(jù)倉庫中時間類型操作(進階)INTERVAL、EXTRACT以及如何確定一年是否為閏年及周的計算
【SQL開發(fā)實戰(zhàn)技巧】系列(十九):數(shù)據(jù)倉庫中時間類型操作(進階)如何一個SQL打印當月或一年的日歷?如何確定某月內(nèi)第一個和最后—個周內(nèi)某天的日期?
【SQL開發(fā)實戰(zhàn)技巧】系列(二十):數(shù)據(jù)倉庫中時間類型操作(進階)獲取季度開始結(jié)束時間以及如何統(tǒng)計非連續(xù)性時間的數(shù)據(jù)
【SQL開發(fā)實戰(zhàn)技巧】系列(二十一):數(shù)據(jù)倉庫中時間類型操作(進階)識別重疊的日期范圍,按指定10分鐘時間間隔匯總數(shù)據(jù)
【SQL開發(fā)實戰(zhàn)技巧】系列(二十二):數(shù)倉報表場景? 從分析函數(shù)效率一定快嗎聊一聊結(jié)果集分頁和隔行抽樣實現(xiàn)方式
【SQL開發(fā)實戰(zhàn)技巧】系列(二十三):數(shù)倉報表場景? 如何對數(shù)據(jù)排列組合去重以及通過如何找到包含最大值和最小值的記錄這個問題再次用執(zhí)行計劃給你證明分析函數(shù)性能不一定高
【SQL開發(fā)實戰(zhàn)技巧】系列(二十四):數(shù)倉報表場景?通過案例執(zhí)行計劃詳解”行轉(zhuǎn)列”,”列轉(zhuǎn)行”是如何實現(xiàn)的
【SQL開發(fā)實戰(zhàn)技巧】系列(二十五):數(shù)倉報表場景?結(jié)果集中的重復數(shù)據(jù)只顯示一次以及計算部門薪資差異高效的寫法以及如何對數(shù)據(jù)進行快速分組
【SQL開發(fā)實戰(zhàn)技巧】系列(二十六):數(shù)倉報表場景?聊聊ROLLUP、UNION ALL是如何分別做分組合計的以及如何識別哪些行是做匯總的結(jié)果行
【SQL開發(fā)實戰(zhàn)技巧】系列(二十七):數(shù)倉報表場景?通過對移動范圍進行聚集來詳解分析函數(shù)開窗原理以及如何一個SQL打印九九乘法表
【SQL開發(fā)實戰(zhàn)技巧】系列(二十八):數(shù)倉報表場景?人員分布問題以及不同組(分區(qū))同時聚集如何實現(xiàn)
【SQL開發(fā)實戰(zhàn)技巧】系列(二十九):數(shù)倉報表場景?簡單的樹形(分層)查詢以及如何確定根節(jié)點、分支節(jié)點和葉子節(jié)點
【SQL開發(fā)實戰(zhàn)技巧】系列(三十):數(shù)倉報表場景?樹形(分層)查詢?nèi)绾闻判颍恳约叭绾卧跇湫尾樵冎姓_的使用where條件
【SQL開發(fā)實戰(zhàn)技巧】系列(三十一):數(shù)倉報表場景?分層查詢?nèi)绾沃徊樵儤湫谓Y(jié)構(gòu)某一個分支?如何剪掉一個分支?
【SQL開發(fā)實戰(zhàn)技巧】系列(三十二):數(shù)倉報表場景?對表中某個字段內(nèi)的值去重
【SQL開發(fā)實戰(zhàn)技巧】系列(三十三):數(shù)倉報表場景?從不固定位置提取字符串的元素以及搜索滿足字母在前數(shù)字在后等條件的數(shù)據(jù)
前言
本篇文章講解的主要內(nèi)容是:通過需求:從不固定位置提取字符串的元素,要求取出方括號中對應的字符串,分三列顯示。給大家介紹regexp_substr正則表達式日常工作中的巧妙用法。通過需求:搜索同時包含字母數(shù)字混合的字符串,要求返回T中既包含字母,又包含數(shù)字的行。那么只要其中有"字母在前,數(shù)字在后"或"數(shù)字在前,字母在后"的數(shù)據(jù)均可需求,介紹regexp_like的使用場景。
【SQL開發(fā)實戰(zhàn)技巧】這一系列博主當作復習舊知識來進行寫作,畢竟SQL開發(fā)在數(shù)據(jù)分析場景非常重要且基礎(chǔ),面試也會經(jīng)常問SQL開發(fā)和調(diào)優(yōu)經(jīng)驗,相信當我寫完這一系列文章,也能再有所收獲,未來面對SQL面試也能游刃有余~。
一、從不固定位置提取字符串的元素
有下面測試數(shù)據(jù):
with t as
(SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg
FROM dual
union all
select 'FEDERAL ID#[zhao]45 3972708 MR [yan]GARY HANSON 25 SHORELINE DR DANA POINT CA 92629[dong]'
from dual
UNION ALL
SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg
FROM dual
UNION all
SELECT 'call:[F_GET_ROWS()]bl:[ROSEWOOD...SIR]b2:[44400002]77.90xxxxx' msg
FROM dual)
select * from t;
MSG
--------------------------------------------------------------------------------
xxxxxabc[867]xxx[-]xxxx[5309]xxxxx
FEDERAL ID#[zhao]45 3972708 MR [yan]GARY HANSON 25 SHORELINE DR DANA POINT CA 92
xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx
call:[F_GET_ROWS()]bl:[ROSEWOOD...SIR]b2:[44400002]77.90xxxxx
現(xiàn)在有個需求:要求取出方括號中對應的字符串,分三列顯示。
我們來分析一下,這里的分隔符是兩個’[’,’]’,按前面文章我講的方法,這個需求我們可以實現(xiàn)為:
with t as
(SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg
FROM dual
union all
select 'FEDERAL ID#[zhao]45 3972708 MR [yan]GARY HANSON 25 SHORELINE DR DANA POINT CA 92629[dong]'
from dual
UNION ALL
SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg
FROM dual
UNION all
SELECT 'call:[F_GET_ROWS()]bl:[ROSEWOOD...SIR]b2:[44400002]77.90xxxxx' msg
FROM dual)
select
regexp_substr(msg,'[^][]+',1,2) as ones,
regexp_substr(msg,'[^][]+',1,4) as twos,
regexp_substr(msg,'[^][]+',1,6) as thrs
from t;
ONES TWOS THRS
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
867 - 5309
zhao yan dong
11271978 4 Joe
F_GET_ROWS() ROSEWOOD...SIR 44400002
看上面結(jié)果,我們是實現(xiàn)了這個需求的。但是別高興太早了,如果增加一行下面這種數(shù)據(jù)呢?
with t as
(SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg
FROM dual
union all
select 'FEDERAL ID#[zhao]45 3972708 MR [yan]GARY HANSON 25 SHORELINE DR DANA POINT CA 92629[dong]'
from dual
UNION ALL
SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg
FROM dual
UNION all
SELECT 'call:[F_GET_ROWS()]bl:[ROSEWOOD...SIR]b2:[44400002]77.90xxxxx' msg
FROM dual union all
select '[zhao][y][d]' from dual)
select
regexp_substr(msg,'[^][]+',1,2) as ones,
regexp_substr(msg,'[^][]+',1,4) as twos,
regexp_substr(msg,'[^][]+',1,6) as thrs
from t;
ONES TWOS THRS
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
867 - 5309
zhao yan dong
11271978 4 Joe
F_GET_ROWS() ROSEWOOD...SIR 44400002
y
誒嘿,明明新加的'[zhao][y][d]'
這條數(shù)據(jù)的'zhao y d'
也是符合要求的,上面查詢?yōu)樯毒椭徊槌鰜砹藗€’y’啊?這樣查有問題?。。。?br> 通過上面問題,我們拋出來個問題:如何更準確的定位?
其實我們可以考慮,把包含方括號在內(nèi)的數(shù)據(jù)一起取出來,然后再去除方括號!那么解決方案如下:
先查出來含方括號的數(shù)據(jù):
with t as
(SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg
FROM dual
union all
select 'FEDERAL ID#[zhao]45 3972708 MR [yan]GARY HANSON 25 SHORELINE DR DANA POINT CA 92629[dong]'
from dual
UNION ALL
SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg
FROM dual
UNION all
SELECT 'call:[F_GET_ROWS()]bl:[ROSEWOOD...SIR]b2:[44400002]77.90xxxxx' msg
FROM dual union all
select '[zhao][y][d]' from dual)
select
regexp_substr(msg,'(\[)([^]]+)',1,1) as ones,
regexp_substr(msg,'(\[)([^]]+)',1,2) as twos,
regexp_substr(msg,'(\[)([^]]+)',1,3) as thrs
from t;
ONES TWOS THRS
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
[867 [- [5309
[zhao [yan [dong
[11271978 [4 [Joe
[F_GET_ROWS() [ROSEWOOD...SIR [44400002
[zhao [y [d
這里"(\[)"
,中的斜杠是轉(zhuǎn)義字符,"(\[)"
放在括號里是為了便于區(qū)分和理解。"([^]]+)"
就是用"]"作為分隔符的一個正則表達式,同樣,"[^]]+
“放在括號里是為了便于區(qū)分和理解。
上面查詢語句的查詢結(jié)果,和我們的需求基本一致了,但是還有個”["要去掉,那么再進行一次ltrim就好啦:
with t as
(SELECT 'xxxxxabc[867]xxx[-]xxxx[5309]xxxxx' msg
FROM dual
union all
select 'FEDERAL ID#[zhao]45 3972708 MR [yan]GARY HANSON 25 SHORELINE DR DANA POINT CA 92629[dong]'
from dual
UNION ALL
SELECT 'xxxxxtime:[11271978]favnum:[4]id:[Joe]xxxxx' msg
FROM dual
UNION all
SELECT 'call:[F_GET_ROWS()]bl:[ROSEWOOD...SIR]b2:[44400002]77.90xxxxx' msg
FROM dual union all
select '[zhao][y][d]' from dual)
select
ltrim(regexp_substr(msg,'(\[)([^]]+)',1,1),'[') as ones,
ltrim(regexp_substr(msg,'(\[)([^]]+)',1,2),'[') as twos,
ltrim(regexp_substr(msg,'(\[)([^]]+)',1,3),'[') as thrs
from t;
ONES TWOS THRS
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
867 - 5309
zhao yan dong
11271978 4 Joe
F_GET_ROWS() ROSEWOOD...SIR 44400002
zhao y d
二、搜索字母數(shù)字混合的字符串
現(xiàn)有如下數(shù)據(jù):
with t as (
select 'zhaoyandong' as str from dual union all
select '345345zhaoyd' as str from dual union all
select 'zyd43223' as str from dual union all
select '23423' as str from dual union all
select '1000' as str from dual
)
select * from t;
STR
------------
zhaoyandong
345345zhaoyd
zyd43223
23423
1000
現(xiàn)在有個需求:要求返回T中既包含字母,又包含數(shù)字的行。
那么只要其中有"字母在前,數(shù)字在后"或"數(shù)字在前,字母在后"的數(shù)據(jù)均可。
那么我們先來查出來"字母在前,數(shù)字在后"的數(shù)據(jù):
with t as (
select 'zhaoyandong' as str from dual union all
select '345345zhaoyd' as str from dual union all
select 'zyd43223' as str from dual union all
select '23423' as str from dual union all
select '1000' as str from dual
)
select * from t where regexp_like(str,'^([[:alpha:]]+).*([[:digit:]]+)$');
STR
------------
zyd43223
再查出來"數(shù)字在前,字母在后"的數(shù)據(jù):
with t as (
select 'zhaoyandong' as str from dual union all
select '345345zhaoyd' as str from dual union all
select 'zyd43223' as str from dual union all
select '23423' as str from dual union all
select '1000' as str from dual
)
select * from t where regexp_like(str,'^([[:digit:]]+).*([[:alpha:]]+)$');
STR
------------
345345zhaoyd
二者結(jié)合一下就可以啦,如下查詢:
with t as (
select 'zhaoyandong' as str from dual union all
select '345345zhaoyd' as str from dual union all
select 'zyd43223' as str from dual union all
select '23423' as str from dual union all
select '1000' as str from dual
)
select * from t where regexp_like(str,'^([[:alpha:]]+).*([[:digit:]]+)$|^([[:digit:]]+).*([[:alpha:]]+)$');
STR
------------
345345zhaoyd
zyd43223
'|'是或則的意思!文章來源:http://www.zghlxwxcb.cn/news/detail-411862.html
總結(jié)
本篇文章講解的主要內(nèi)容是:通過需求:從不固定位置提取字符串的元素,要求取出方括號中對應的字符串,分三列顯示。給大家介紹regexp_substr正則表達式日常工作中的巧妙用法。通過需求:搜索同時包含字母數(shù)字混合的字符串,要求返回T中既包含字母,又包含數(shù)字的行。那么只要其中有"字母在前,數(shù)字在后"或"數(shù)字在前,字母在后"的數(shù)據(jù)均可需求,介紹regexp_like的使用場景。文章來源地址http://www.zghlxwxcb.cn/news/detail-411862.html
到了這里,關(guān)于【SQL開發(fā)實戰(zhàn)技巧】系列(三十三):數(shù)倉報表場景?從不固定位置提取字符串的元素以及搜索滿足字母在前數(shù)字在后等條件的數(shù)據(jù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!