我已将参数<?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,'');
,则预期输出。任何人都可以提出这样做的想法吗?
答案 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