我正在寻找帮助。我正在将某些东西从Oracle转换到SQL Server,并且很烦。
select distinct
field1, field2,
regexp_substr(path, '[^/]+', 1, column_value) elem
from
grouped,
table(cast(multiset(select level from dual
connect by level <= regexp_count(path,'/')) as sys.odciNumberList))
where regexp_substr(path, '[^/]+', 1, column_value) is not null),
result as (
select field1, field2,
dense_rank()
over (order by listagg(elem,',') within group (order by elem))
grp
from split
group by field1, field2
我给人的印象是,使用STUFF函数可能是listagg()
函数的替代方法,但是要想走得更远,我需要弄清楚如何转换regex_substr()
代码转到SQL Server 2012。
示例数据:
field1 field2
--------------------------------
02598559 | /04460516
04355059 | /04460576/05339398
04352043 | /04461255
--------------------------------
解决这个问题的最佳方法是什么?
答案 0 :(得分:0)
我不确定我是否理解其余的逻辑,但这会将定界的字符串拆分为一个表,我确定您可以将其用于查询的其余部分:
这是测试数据:
declare @t table(f1 varchar(10), f2 varchar(50))
insert @t values ('02598559','/04460516'),('04355059','/04460576/05339398'),('04352043','/04461255')
select * from @t
这是分成几行的数据:
SELECT f1, O.splitdata
FROM
(
SELECT *, cast('<X>' + replace(stuff(f2,1,1,''),'/','</X><X>')+'</X>' as XML) as xmlfilter from @t F
)F1
CROSS APPLY
(
SELECT fdata.D.value('.','varchar(50)') as splitdata
FROM f1.xmlfilter.nodes('X') as fdata(D)
) O
这是结果:
f1 splitdata
02598559 04460516
04355059 04460576
04355059 05339398
04352043 04461255
希望这会为您指明正确的方向。