oralce逗號分割變多行 Oracle中REGEXP_SUBSTR函式
Oracle中REGEXP_SUBSTR函式
Oracle中REGEXP_SUBSTR函式的使用說明: 題目如下: 在oracle中,使用一條語句實現將'17,20,23'拆分成'17','20','23'的集合。 REGEXP_SUBSTR函式格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcstr :需要進行正則處理的字串 __pattern :進行匹配的正則表示式 __position :起始位置,從第幾個字元開始正則表示式匹配(預設為1) __occurrence :標識第幾個匹配組,預設為1 __modifier :模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。) 1、查詢使用正則分割後的第一個值,也就是17 [sql] SELECT REGEXP_SUBSTR('17,20,23','[^,]+',1,1,'i') AS STR FROM DUAL; 結果: www.2cto.com STR ----- 17 2、查詢使用正則分割後的最後一個值,也就是23 [sql] SELECT REGEXP_SUBSTR('17,20,23','[^,]+',1,3,'i') AS STR FROM DUAL; 結果: STR ---- 23 3、獲取一個多個數值的列,從而能夠讓結果以多行的形式展示出來 [sql] SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=7; 結果: www.2cto.com LEVEL ---- 1 2 3 4 5 6 7 4、將上面REGEXP_SUBSTR的occurrence關聯 [sql] SELECT NVL(REGEXP_SUBSTR('17,20,23', '[^,]+', 1, LEVEL, 'i'), 'NULLL') AS STR FROM DUAL CONNECT BY LEVEL <= 7; STR www.2cto.com ---- 17 20 23 NULL NULL NULL NULL 5、優化上面的SQL語句,讓生成的行的數量符合實際情況 [sql] SELECT REGEXP_SUBSTR('17,20,23', '[^,]+', 1, LEVEL, 'i') AS STR FROM DUAL CONNECT BY LEVEL <= LENGTH('17,20,23') - LENGTH(REGEXP_REPLACE('17,20,23', ',', ''))+1; STR ---- 17 20 23oralce逗號分割變多行
方法一
select a.* ,
REGEXP_SUBSTR(a.rolecode ,'[^,]+',1,l) AS rolecode
from p_user a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(a.rolecode) - LENGTH(REPLACE(rolecode,','))+1
www.2cto.com
使用函式REGEXP_SUBSTR拆分字串:
5個引數
第一個是輸入的字串
第二個是正則表示式
第三個是標識從第幾個字元開始正則表示式匹配。(預設為1)
第四個是標識第幾個匹配組。(預設為1)
第五個是是取值範圍:
i:大小寫不敏感;
c:大小寫敏感;
n:點號 . 不匹配換行符號;
m:多行模式;
x:擴充套件模式,忽略正則表示式中的空白字元。
SELECT a.*,REGEXP_SUBSTR(servicereqid ,'[^;]+',1,l) AS servicereq
FROM sum_portal_satisfaction a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(servicereqid) - LENGTH(REPLACE(servicereqid,';'))+1
ORDER BY 1,2;
----SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100; 生成1到100的資料行。
----l <=LENGTH(servicereqid) - LENGTH(REPLACE(servicereqid,';'))+1,注意此處是‘L’並非‘1’,上面的REGEXP_SUBSTR的第四個引數也一樣。
---下面為拆分字串,再進行的行轉列
create or replace view v_sum_portal_satisfaction_sr as
select
survey_type,
survey_time,
center_code,
center_name,
city_id,
city_name,
REGEXP_SUBSTR(servicereqid ,'[^;]+',1,l) AS servicereqid,
REGEXP_SUBSTR(servicereqname ,'[^;]+',1,l) AS servicereqname,
sum(decode(survey_value,0, sur_times,null)) giveup_times,--調查值 -1:未處理 0:使用者放棄 1:很滿意 2.滿意 3.對csr不滿意 4.對其它不滿意
sum(decode(survey_value,1, sur_times,null))vsatis_times,
sum(decode(survey_value,2, sur_times,null))satis_times,
sum(decode(survey_value,3, sur_times,null))ncsr_times,
sum(decode(survey_value,4, sur_times,null))nelse_times,
sum(sur_times) sur_times
FROM sum_portal_satisfaction a,(SELECT LEVEL l FROM DUAL CONNECT BY LEVEL<=100) b
WHERE l <=LENGTH(servicereqid) - LENGTH(REPLACE(servicereqid,';'))+1
group by
subslevelid,
center_code,
center_name,
city_id,
city_name,
survey_type,
survey_time,
servicereqid,
servicereqname,l
方法二:
create table testTable (
id nvarchar2(200) primary key not null ,
content nvarchar2(200) not null
)
insert into testTable values ('4','館內idx_10館外idx_11總體idx_12');
select * from table ( CAST (fn_split(('館內idx_1$館外idx_2$總體idx_3$') ,'$') as ty_str_split ) )
select * from testtable b left join table (fn_split((content), '$') ) a on 1=1;
--實現split函式
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);
WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);
IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;
RETURN str_split;
END fn_split;
DECLARE
CURSOR c
IS
select * from table ( CAST (fn_split(('館內idx_1$館外idx_2$總體idx_3$') ,'$') as ty_str_split ) );
r c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO r;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.put_line (r.column_value);
END LOOP;
CLOSE c;
END;
相關推薦
oralce逗號分割變多行 Oracle中REGEXP_SUBSTR函式
Oracle中REGEXP_SUBSTR函式 Oracle中REGEXP_SUBSTR函式的使用說明: 題目如下: 在oracle中,使用一條語句實現將'17,20,23'拆分成'17','20','23'的集合。 REGEXP_SUBSTR函式格式如下: funct
SQLSERVER , 逗號 分割為多行
今天工作遇到了這個需求,發現有幾種辦法可行.現先記錄最簡便的辦法 方法1 select INTERNAL_FAULT_REASON from TEST_TABLE ; select sub
Oracle中REGEXP_SUBSTR函式(字串轉多行)
Oracle中REGEXP_SUBSTR函式的使用說明: 題目如下: 在oracle中,使用一條語句實現將’17,20,23’拆分成’17’,’20’,’23’的集合。 REGEXP_SUBSTR函式格式如下: function REGEXP_SUB
Oracle中REGEXP_SUBSTR函式的使用說明
Oracle中REGEXP_SUBSTR函式的使用說明: 題目如下: 在oracle中,使用一條語句實現將'17,20,23'拆分成'17','20','23'的集合。 REGEXP_SUBSTR函式格式如下: function REGEXP_SUBSTR(String,
Hive中“一行變多行”、“多行合成一行”的實現例項
Ø 一行變多行過程: // 一行拆分多行的操作:主要是拆分subcat不為空的記錄,sql語句如下: insert into table today_cust_behavior_single select msisdn ,flow_start,flow_end,kk as subcat from toda
oracle 將一個字串分割成多行
第一種方法: select substr(t,1,instr(t,',',1)-1) from ( select substr(s,instr(s,',',1,rownum)+1)||',' as t,rownum as d ,instr(s,',',1,rownum)+1
記錄:50多行程序中找出多寫的一個字母e
lan .net ont isp 快樂 sdn p s ora 調試 小霍同學調程序,做的是第11周的項目1 - 存儲班長信息的學生類,可是她寫的程序(就在以下)
要求從使用者輸入的多行文字中提取學生的姓名、學號及登入日期,並封裝到 Student 類中作為類的私有屬性。建立一個 Student 型別的物件陣列,對學號進行 升序排序並輸出
/*從鍵盤輸入多行文字,格式如下:學生端名稱,姓名,班級名稱,學生 ID,註冊時間 姜濤,姜濤,,20092212232,2011-11-4 9:06:56 任超,任超,,20092212239,2011-11-4 9:06:56 楊陽,楊陽,,20092212302,20
要求從使用者輸入的多行文字中提取學生的姓名、學號及登入日期,並封裝到 Student 類中作為類的私有屬性。建立一個Student型別的物件陣列,對學號進行 升序排序並輸出。
/*部落格網站設定了校驗密碼的規則,編寫方法檢驗一個字串是否是合法的密碼。規則如下: 密碼長度在8-16之間 密碼只能包含字母和數字 密碼必須存在至少2個數字 如果使用者輸入的密碼符合規則就顯示valid password,否則提示Invalid passwor
sql 將‘1,2,3,4’轉成相應的表,欄位分隔表值函式,一行變多行,
再設計表的時候我們經常遇到這樣的情況,欄位的值為1,2,3,4 等字元隔開的情況,存的是數字,但是顯示的時候是對應的類別,直接上圖,清楚明瞭, 如何想得到 分兩步完成,步驟如下: 第一步先創造 一個表值函式,將1,2,3,4 轉化為 函式是從網上找來的,程式碼如下:
Hive資料處理之一行變多行
直接舉例子: hive> select dp_android_dlu, video_android_dlu from video_mertics where p_date=2014120
oracle--多行轉為一行 (listagg函式)
今天遇到將多行轉為一行的一個操作,多謝oracle開發板的 wildwave 提供了比較通用的解決辦法,同時也將自己搜到的這方面資料整理如下,多是用於連線列值的。 String集聚連線技術 需要將多行轉換為一行,例子如下: 基礎資料: DE
SQL Server 將一個欄位的內容按逗號分隔成多行顯示
drop table Tab Go Create table Tab([Col1] int,[COl2] nvarchar(5)) Insert Tab select 1,N'a,b,c' union all select 2,N'd,e' union all select 3,N'f
oracle中REGEXP_SUBSTR方法的使用
word 位置 那是 process 網上 部分 parent post cda 近期在做商旅機票平臺,遇到這樣一個問題: 有一張tt_ticket表,用來存機票信息。裏邊有一個字段叫schedule,表示的是行程,存儲格式為:北京/虹橋 由於公司
Oracle中add_months()函式的用法
查詢當前時間1個月以前的時間: select add_months(sysdate,-1) from dual; 查詢當前時間1個月以後的時間: select add_months(sysdate,1) from dual; 如對公司員工表:查詢2年前進入公司的員工的姓
【轉載】oracle中decode函式用法
1、DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else)。表示假設value 等於if1時,DECODE函式的結果返回then1,...,假設不等於不論什麼一個if值。則返回else 2、該函式的含義例如以下: IF 條件=值1 TH
Oracle中instr函式使用方法
在Oracle/PLSQL中,instr函式返回要擷取的字串在源字串中的位置。只檢索一次,就是說從字元的開始到字元的結尾就結束 INSTR (源字串, 目標字串, 起始位置, 匹配序號) 在Oracle/PLSQL中,instr函式返回要擷取的字串在源字串中的位置。只檢
ORACLE中部分函式的用法
select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,…,else)
Python多執行緒中join函式與setDaemon函式使用說明
在Python多執行緒程式設計的時候,經常需要用到join函式和setDaemon函式。之前對這兩個函式一直理解不是很到位。今天查閱了很多資料,對兩個函式的認識更加的深入一些了。 join([timeout])可以參考Python文件說明。大概意思就
oracle中round函式的使用
Round 函式 語法為ROUND(number,num_digits) 其中Number是需要進行四捨五入的數字;Num_digits為指定的位數,按此位數進行四捨五入, 如果 num_digits 大於 0,則四捨五入到指定的小數位,如果 num_digits 等於