SQL Server 2012:提取正则表达式组

我的数据库中有Markdown格式的文本。我想提取链接并计算我拥有的匹配链接的数量。我可以使用类似于以下的查询来获取包含链接的文本块的列表:

SELECT post_text

FROM posts p

WHERE p.body like '%\[%](http%)%' ESCAPE '\'

但是,如何进行下一步,仅提取文本的链接部分(括号中的部分)?如果可以得到,则可以计算此特定链接在我的数据集中的次数。

一些样本数据:

"Visit [Google](http://google.com)"    -> Should return "http://google.com"

"Get an [iPhone](http://www.apple.com) (I like it better than Android)" -> Should return "http://www.apple.com"

"[Example](http://example.com)" -> Should return "http://example.com"

"This is a message" -> Nothing to return on this one, no link

"I like cookies (chocolate chip)" -> Nothing to return on this one, no link

"[Frank] says 'Hello'" -> Nothing to return on this one, no link

我正在使用SQL Server 2012(如果这方面的版本之间存在差异)。

回答:

假设实际数据不比所陈述的示例复杂,这应该在不求助于RegEx的情况下起作用:

DECLARE @posts TABLE

(

post_id INT NOT NULL IDENTITY(1, 1),

post_text NVARCHAR(4000) NOT NULL,

body NVARCHAR(2048) NULL

);

INSERT INTO @posts (post_text, body) VALUES (N'first',

N'Visit [Google](http://google.com)');

INSERT INTO @posts (post_text, body) VALUES (N'second',

N'Get an [iPhone](http://www.apple.com)');

INSERT INTO @posts (post_text, body) VALUES (N'third',

N'[Example](http://example.com)');

INSERT INTO @posts (post_text, body) VALUES (N'fourth',

N'This is a message');

INSERT INTO @posts (post_text, body) VALUES (N'fifth',

N'I like cookies (chocolate chip)');

INSERT INTO @posts (post_text, body) VALUES (N'sixth',

N'[Frankie] says ''Relax''');

INSERT INTO @posts (post_text, body) VALUES (N'seventh',

NULL);

SELECT p.post_text,

SUBSTRING(

p.body,

CHARINDEX(N'](', p.body) + 2,

CHARINDEX(N')', p.body) - (CHARINDEX(N'](', p.body) + 2)

) AS [URL]

FROM @posts p

WHERE p.body like '%\[%](http%)%' ESCAPE '\';

输出:

post_text  URL

first http://google.com

second http://www.apple.com

third http://example.com

PS:

如果您 真的

想使用正则表达式,则只能通过SQLCLR完成。您可以编写自己的库或下载预完成的库。我写了一个这样的库SQL#,它具有包含RegEx函数的免费版本。但是,只有在找不到T-

SQL解决方案的情况下才应使用这些方法,到目前为止,这里不是这种情况。

以上是 SQL Server 2012:提取正则表达式组 的全部内容, 来源链接: utcz.com/qa/423496.html

回到顶部