将regex_substr和listagg代码转换为SQL Server

时间:2018-09-27 19:12:34

标签: sql-server oracle oracle11g sql-server-2012

我正在寻找帮助。我正在将某些东西从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
--------------------------------

解决这个问题的最佳方法是什么?

1 个答案:

答案 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

希望这会为您指明正确的方向。