【问题标题】:SQL Server 2014: Regex to substringSQL Server 2014:正则表达式到子字符串
【发布时间】:2016-12-12 15:44:08
【问题描述】:

在 SQL SERVER 2014 中如何使用正则表达式提取字符串?示例:

CN=John Lee  709123,ou=Users,OU=LA-US1242,OU=US,OU=nam,DC=DIR,DC=ABB,DC=com

SQL 将返回 John Lee

正则表达式是 ^CN=([^0-9]+) 但是如何应用这个正则表达式是 SQL ?

【问题讨论】:

标签: sql-server tsql sql-server-2014


【解决方案1】:

RegEx 和 SQL Server 不是最好的朋友...

你可以这样尝试:

DECLARE @s NVARCHAR(100)=N'CN=John Lee  709123,ou=Users,OU=LA-US1242,OU=US,OU=nam,DC=DIR,DC=ABB,DC=com';

WITH Splitted AS
(
    SELECT CAST('<x>' + REPLACE(@s,',','</x><x>') + '</x>' AS XML) AS AsXml
) 
SELECT LEFT(part,Pos.Eq-1) AS KeyName
      ,SUBSTRING(part,Pos.Eq +1,1000) AS KeyValue
FROM Splitted
CROSS APPLY AsXml.nodes('/x') AS A(a) 
CROSS APPLY (SELECT a.value('.','nvarchar(max)')) AS The(part)
CROSS APPLY(SELECT CHARINDEX('=',part)) AS Pos(Eq)

结果

Key Value
-----------------
CN  John Lee  709123
ou  Users
OU  LA-US1242
OU  US
OU  nam
DC  DIR
DC  ABB
DC  com

更新更直接的方法...

DECLARE @s NVARCHAR(100)=N'CN=John Lee  709123,ou=Users,OU=LA-US1242,OU=US,OU=nam,DC=DIR,DC=ABB,DC=com';

DECLARE @partRev NVARCHAR(100)=REVERSE(SUBSTRING(@s,CHARINDEX('=',@s)+1,CHARINDEX(',',@s)-4));
SELECT LTRIM(RTRIM(REVERSE(SUBSTRING(@partRev,CHARINDEX(' ',@partRev),1000))));

【讨论】:

  • 这是解决此问题的另一种方法。谢谢
【解决方案2】:

解决这个问题的另一种非常有效的方法:

-- your sample data
DECLARE @s NVARCHAR(100)=N'CN=John Lee  709123,ou=Users,OU=LA-US1242,OU=US,OU=nam,DC=DIR,DC=ABB,DC=com';

-- solution
SELECT SUBSTRING(s, s1, s2-s1) 
FROM (VALUES (@s)) t(s)
CROSS APPLY (VALUES (charindex('CN=', @s)+3, patindex('%[0-9]%', @s))) tt(s1, s2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多