如何使用 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