1. 程式人生 > >oralce逗號分割變多行 Oracle中REGEXP_SUBSTR函式

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 23

oralce逗號分割變多行

方法一

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逗號分割 OracleREGEXP_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

OracleREGEXP_SUBSTR函式(字串轉)

Oracle中REGEXP_SUBSTR函式的使用說明: 題目如下: 在oracle中,使用一條語句實現將’17,20,23’拆分成’17’,’20’,’23’的集合。 REGEXP_SUBSTR函式格式如下: function REGEXP_SUB

OracleREGEXP_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

oracleREGEXP_SUBSTR方法的使用

word 位置 那是 process 網上 部分 parent post cda 近期在做商旅機票平臺,遇到這樣一個問題: 有一張tt_ticket表,用來存機票信息。裏邊有一個字段叫schedule,表示的是行程,存儲格式為:北京/虹橋 由於公司

Oracleadd_months()函式的用法

查詢當前時間1個月以前的時間: select add_months(sysdate,-1) from dual; 查詢當前時間1個月以後的時間:   select add_months(sysdate,1) from dual;   如對公司員工表:查詢2年前進入公司的員工的姓

【轉載】oracledecode函式用法

1、DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else)。表示假設value 等於if1時,DECODE函式的結果返回then1,...,假設不等於不論什麼一個if值。則返回else 2、該函式的含義例如以下:  IF 條件=值1 TH

Oracleinstr函式使用方法

在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文件說明。大概意思就

oracleround函式的使用

Round 函式  語法為ROUND(number,num_digits) 其中Number是需要進行四捨五入的數字;Num_digits為指定的位數,按此位數進行四捨五入, 如果 num_digits 大於 0,則四捨五入到指定的小數位,如果 num_digits 等於