如何使用Oracle在`=`之前和之后交换值?

时间:2015-08-21 13:20:05

标签: oracle swap

我已将参数<?php $students=array( "HINDI"=>array("marks"=>"96","grade"=>"1st"), "ENGLISH"=>array("marks"=>"92","grade"=>"1st") ); $output = ''; foreach($students as $name => $student) { $output .= ' subject='.$name; foreach($student as $key => $value) $output .= ' '.$key.'='.$value; } echo $output; ?> 中的值声明为@Data

我需要获得ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1的结果。

这意味着我需要在ACCOUNT_NO=ACCOUNT_NO|none|M,ADD1=ADD1|none|M

之前和之后交换值

我有SQL Server Query来实现这一点,但我需要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,''); ,则预期输出。任何人都可以提出这样做​​的想法吗?

1 个答案:

答案 0 :(得分:4)

听起来像是REGEXP_REPLACE的工作:

WITH datatab as (select 'ACCOUNT_NO|none|M=ACCOUNT_NO,ADD1|none|M=ADD1' info from dual)
select info,
       regexp_replace(info, '([^=]+)=([^=,]+),([^=]+)=([^=,]+)', '\2=\1,\4=\3') 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

(作为一个完整的旁边,这是我第一次写一个正则表达式并让它第一次工作。显然,我已经走到了黑暗的一面...... * {;-))

ETA:如果你需要在一个过程/函数中使用它,你不需要费心选择正则表达式,你可以直接在PL / SQL中完成。

这是一个返回交换结果的函数示例:

create or replace function swap_places (p_data in varchar2)
return varchar2
is
begin
  return regexp_replace(p_data, '([^=]+)=([^=,]+),([^=]+)=([^=,]+)', '\2=\1,\4=\3');
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