如何使用 Oracle 在 `=` 前后交换值?
How to swap values between before and after `=` using Oracle?
我已将参数 @Data
中的值声明为 ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1
我需要得到 ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
的结果。
这意味着我需要在 =
之前和之后的值之间进行交换
我有 来实现这个,但我需要 Oracle 查询。
Declare @Data varchar(100)='ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1';
WITH
myCTE1 AS
(
SELECT CAST('<root><r>' + REPLACE(@Data,',','</r><r>') + '</r></root>' AS XML) AS parts1
)
,myCTE2 AS
(
SELECT CAST('<root><r>' + REPLACE(p1.x.value('.','varchar(max)'),'=','</r><r>') + '</r></root>' AS XML) as parts2
FROM myCTE1
CROSS APPLY parts1.nodes('/root/r') AS p1(x)
)
SELECT STUFF
(
(
SELECT ',' + parts2.value('/root[1]/r[2]','varchar(max)') + '=' + parts2.value('/root[1]/r[1]','varchar(max)')
FROM myCTE2
FOR XML PATH(''),TYPE
).value('.','varchar(max)'),1,1,'');
执行查询时的预期输出 ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
。任何人都可以提供一个想法吗?
听起来像是 REGEXP_REPLACE 的工作:
WITH datatab as (select 'ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1' info from dual)
select info,
regexp_replace(info, '([^=]+)=([^=,]+),([^=]+)=([^=,]+)', '=,=') new_info
from datatab;
INFO NEW_INFO
--------------------------------------------- ---------------------------------------------
ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1 ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
(顺便说一句,这是我第一次编写正则表达式并让它第一次运行。显然,我已经走到了黑暗的一面...... *{;-) )
预计到达时间:如果您需要在 procedure/function 中使用,则无需费心选择正则表达式,直接在 PL/SQL 中即可。
这是一个 returns 交换结果的函数示例:
create or replace function swap_places (p_data in varchar2)
return varchar2
is
begin
return regexp_replace(p_data, '([^=]+)=([^=,]+),([^=]+)=([^=,]+)', '=,=');
end swap_places;
/
-- example of calling the function to check the result
select swap_places('ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1') col1 from dual;
COL1
-------------------------------------------------
ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
我已将参数 @Data
中的值声明为 ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1
我需要得到 ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
的结果。
这意味着我需要在 =
我有
Declare @Data varchar(100)='ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1';
WITH
myCTE1 AS
(
SELECT CAST('<root><r>' + REPLACE(@Data,',','</r><r>') + '</r></root>' AS XML) AS parts1
)
,myCTE2 AS
(
SELECT CAST('<root><r>' + REPLACE(p1.x.value('.','varchar(max)'),'=','</r><r>') + '</r></root>' AS XML) as parts2
FROM myCTE1
CROSS APPLY parts1.nodes('/root/r') AS p1(x)
)
SELECT STUFF
(
(
SELECT ',' + parts2.value('/root[1]/r[2]','varchar(max)') + '=' + parts2.value('/root[1]/r[1]','varchar(max)')
FROM myCTE2
FOR XML PATH(''),TYPE
).value('.','varchar(max)'),1,1,'');
执行查询时的预期输出 ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
。任何人都可以提供一个想法吗?
听起来像是 REGEXP_REPLACE 的工作:
WITH datatab as (select 'ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1' info from dual)
select info,
regexp_replace(info, '([^=]+)=([^=,]+),([^=]+)=([^=,]+)', '=,=') new_info
from datatab;
INFO NEW_INFO
--------------------------------------------- ---------------------------------------------
ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1 ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M
(顺便说一句,这是我第一次编写正则表达式并让它第一次运行。显然,我已经走到了黑暗的一面...... *{;-) )
预计到达时间:如果您需要在 procedure/function 中使用,则无需费心选择正则表达式,直接在 PL/SQL 中即可。
这是一个 returns 交换结果的函数示例:
create or replace function swap_places (p_data in varchar2)
return varchar2
is
begin
return regexp_replace(p_data, '([^=]+)=([^=,]+),([^=]+)=([^=,]+)', '=,=');
end swap_places;
/
-- example of calling the function to check the result
select swap_places('ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1') col1 from dual;
COL1
-------------------------------------------------
ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M