我有一個變數(called: all_email_list),它總共包含3個電子郵件地址串列。(我發現了一些類似的問題,但沒有合適的解決方案)
舉例說明。[email protected], [email protected],[email protected],[email protected], [email protected],[email protected] (它可以在逗號之間包含空格,但不是所有的時間)
期望的輸出。[email protected], [email protected],[email protected],[email protected]
declare
first_email_list varchar2(4000)。
second_email_list varchar2(4000)。
third_email_list varchar2(4000);
all_email_list varchar2(4000)。
begin[/span
select listagg(EMAIL,' 。 ') into first_email_list from UM_USER a left join UM_USERROLLE b on (a. mynetuser=b.NT_NAME) left join UM_RULES c on (c. id=b.RULEID) where RULEID = 902;
select listagg(EMAIL,' 。 ') into second_email_list from table2 where CFT_ID =: P25_CFT_TEAM。
select EMAIL into third_email_list from table3 WHERE : P25_ID = ID。
all_email_list: = first_email_list || ' 。 ' || second_email_list || ',' || third_email_list。
dbms_output.put_line(all_email_list)。
end。
有什么辦法可以簡單地解決這個問題嗎?也許可以通過regex。
uj5u.com熱心網友回復:
解決方案描述。使用CTE首先將電子郵件串列分割成每行有一個電子郵件地址的行(testd_rows)。然后從testd_rows中選擇不同的行(testd_rows_unique),最后用listagg將它們重新組合起來。從19c開始,你可以使用LISTAGG與DISTINCT關鍵字。
set serveroutput on size 999999
清除螢屏
declare
all_email_list varchar2(4000)。
l_unique_email_list varchar2(4000)。
begin[/span
all_email_list := '[email protected], [email protected],[email protected],[email protected], [email protected],[email protected]'/span>。
WITH testd_rows(email) AS.
(
select regexp_substr (all_email_list, '[^, ] '/span>, 1, rownum) split
from double
connect by level <= length (regexp_replace (all_email_list, '[^, ] '/span>) 1)
), testd_rows_unique(email) AS
(
SELECT distinct 電子郵件 FROM testd_rows
)
SELECT listagg(email, ' 。 ') WITHIN GROUP (ORDER BY email)
INTO l_unique_email_list
FROM testd_rows_unique;
dbms_output.put_line(l_unique_email_list)。
end。
/
test2@asd.com,test3@asd.com,test4@asd.com,test@asd.com
但是......為什么你要把行轉換為逗號分隔的字串,然后再去掉它?使用UNION在一個單一的SELECT陳述句中取出重復的值,并對這些值做LISTAGG。這樣就不需要使用重構函式了。UNION將跳過重復的資料,而UNION ALL則回傳所有的記錄。
DECLARE
all_email_list varchar2(4000)。
BEGIN
WITH all_email (email) AS.
(
select email from UM_USER a left join UM_USERROLLE b on (a. mynetuser=b. NT_NAME) left join UM_RULES c on (c. id=b.RULEID) where RULEID = 902
UNION[/span
select email from table2 where CFT_ID =:P25_CFT_TEAM
UNION[/span
select email from table3 WHERE :P25_ID = ID
)
SELECT listagg(email, ' 。 ') WITHIN GROUP (ORDER BY email)
INTO all_email_list
FROM all_email。
dbms_output.put_line(all_email_list)。
END;
/>
uj5u.com熱心網友回復:
你可以利用 apex_string.split table 函式來簡化代碼。
12c 使其真正變得干凈
select listagg(distinct column_value,' , ' ) within group (order by null)
from apex_String.split(replace('[email protected], [email protected],[email protected],[email protected], [email protected],[email protected]')
,' ')
,', ')
11g需要一個封裝的table(),而listagg不支持distinct.
。select listagg(email,' , ') within group (order by null)
from
(select distinct column_value email
from table(apex_String. split(replace('[email protected], [email protected],[email protected],[email protected], [email protected],[email protected]','),','))
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/308143.html
標籤:
