Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2012 :extraire les groupes Regex

En supposant que les données réelles ne sont pas plus complexes que les exemples indiqués, cela devrait fonctionner sans recourir à 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 '\';

Sortie :

post_text  URL
first      http://google.com
second     http://www.apple.com
third      http://example.com

PS :
Si vous vraiment souhaitez utiliser des expressions régulières, elles ne peuvent être effectuées que via SQLCLR. Vous pouvez écrire les vôtres ou télécharger des bibliothèques prédéfinies. J'ai écrit une telle bibliothèque, SQL# , qui a une version gratuite qui inclut les fonctions RegEx. Mais ceux-ci ne doivent être utilisés que si une solution T-SQL est introuvable, ce qui n'est pas le cas ici jusqu'à présent.