【发布时间】:2019-08-29 18:30:16
【问题描述】:
以下算法的目的是从键中提取某些字段集(在本示例中,提取前 2 个字段),并且它有效。字段由冒号分隔:
declare @key nvarchar (max);
declare @pos int;
declare @fields nvarchar (max);
set @key = 'Field-1:Field-2:Field-3:Field-4:Field-5';
set @pos = charindex(':', @key, charindex (':', @key) + 1);
set @fields = left(@key, @pos - 1);
select @fields;
结果:Field-1:Field-2
Microsoft document 说第一个参数是一个表达式,但我认为他们在 CHARINDEX 上下文中的意思是,这个表达式应该计算为字符串文字;因此,以下尝试通过正则表达式来获得第二次出现不起作用;显然要么不支持,要么我使用了错误的语法:
--match the second occurrence of the delimiter using RegEx
set @pos = charindex (':.*?(:)', @key);
换句话说,是否可以使用 RegEx 找到给定文本中第 n 次出现分隔符的位置,这样我就可以避免多个嵌套的 CHARINDEX 或循环解析?顺便说一句,如果 n 作为参数传递,那么我什至不能再使用静态嵌套了...
提前感谢您的帮助。
环境:Microsoft SQL Server 2014 (SP3) 标准版(64 位)
【问题讨论】:
-
您想要第 n 个子字符串或直到第 n 个分隔符的所有内容?
-
PATINDEXdocs.microsoft.com/en-us/sql/t-sql/functions/… 支持模式搜索。没有 Sql-server 功能支持 RegEx。 -
@SalmanA 直到第 n 个分隔符为止的所有内容
-
SQL Server 不擅长这个。您可以使用 rCTE。或者将字符串转换为 XML,找到直到第 n 个节点的所有节点并使用 STRING_AGG 函数重新梳理。无论您使用哪种方法都是笨拙的。
-
@SalmanA 谢谢。 2016 有 STRING_SPLIT,不幸的是我用的是 2014!
标签: sql sql-server regex sql-server-2014 charindex