SQL Server: Değiştirmeyle normal ifadeyi uygulama

Nov 09 2020

İşte benim SQL sorgum:

select codi_nivell 
from anc_documents

Örnek veriler:

06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000
06080100000000

Bu regex'i SQL sorguma uygulamam gerekiyor:

İlk olarak, uzaktan takip etmem gerekiyor 0.

Daha sonra, /her iki basamağı eklemek için bu normal ifadeyi uygulayın :

regex: \d{2}(?=(?:\d{2})+$) replace: $0/

Herhangi bir fikir?

Yanıtlar

GordonLinoff Nov 09 2020 at 11:57

SQL Server, normal ifadeleri desteklemez. Ancak bunu bazı dize işlemleri ve özyinelemeli CTE'ler kullanarak yapabilirsiniz:

with ad as (
      select row_number() over (order by code) as seqnum, replace(rtrim(replace(code, '0', ' ')), ' ', '0') as new_code
      from anc_documents
     ),
     cte as (
      select seqnum, new_code, 0 as offset, 0 as lev
      from ad
      union all
      select seqnum, stuff(new_code, offset + 3, 0, '-'), offset + 3, lev + 1
      from cte
      where offset + 3 < len(new_code) 
     )
select *
from (select max(lev) over (partition by seqnum) as max_lev, cte.*
      from cte
     ) cte
where max_lev = lev;

İşte bir db <> keman.

Tyron78 Nov 09 2020 at 12:29

Bunu XML PATH kullanarak başarabilirsiniz:

DECLARE @codi_nivell NVARCHAR(100) = (SELECT REVERSE(CAST(REVERSE('06080100000000') AS BIGINT)))

;WITH cte AS(
 SELECT @codi_nivell AS codi_nivell, LEFT(@codi_nivell, 2) AS codi_nivell_left, RIGHT(@codi_nivell, LEN(@codi_nivell)-2) AS codi_nivell_right
 UNION ALL
 SELECT @codi_nivell, LEFT(codi_nivell_right, 2), RIGHT(codi_nivell_right, LEN(codi_nivell_right)-2)
   FROM cte
   WHERE LEN(codi_nivell_right) >= 2
)
SELECT STUFF((SELECT '/' + c2.codi_nivell_left
  FROM cte c2
  FOR XML PATH('')), 1, 1, '') y
  FROM cte c1
  GROUP BY c1.codi_nivell