SQL Server中如何提取字符串内#符号之间的所有内容?
提取SQL语句中#包裹内容的解决方案
当然可以实现,由于目标内容长度不固定,SUBSTRING确实不适用,以下提供两种针对SQL Server的可行方案(从你的语句语法判断使用的是SQL Server):
方法一:递归CTE(兼容所有SQL Server版本)
先创建示例表模拟你的数据:
CREATE TABLE YourTable (Commands NVARCHAR(MAX)); INSERT INTO YourTable VALUES ('SELECT - #TRAPAY#'), ('SELECT - #OSTLIA#'), ('SELECT ISNULL(CONVERT(VARCHAR(50), #OPCASH# + #ACCREC# + #INVENT# + #OCASS# + #TRAPAY_N# + #OSTLIA_N#), ''-'')'), ('SELECT #GTFA#'), ('SELECT #ACCDEP#');
使用递归CTE逐对提取#之间的内容:
WITH RecursiveCTE AS ( -- 初始步骤:定位第一对#并提取内容 SELECT Commands, CHARINDEX('#', Commands) AS StartPos, CHARINDEX('#', Commands, CHARINDEX('#', Commands) + 1) AS EndPos, SUBSTRING(Commands, CHARINDEX('#', Commands) + 1, CHARINDEX('#', Commands, CHARINDEX('#', Commands) + 1) - CHARINDEX('#', Commands) - 1) AS ExtractedValue FROM YourTable WHERE CHARINDEX('#', Commands) > 0 UNION ALL -- 递归步骤:继续提取后续的#包裹内容 SELECT r.Commands, CHARINDEX('#', r.Commands, r.EndPos + 1) AS StartPos, CHARINDEX('#', r.Commands, CHARINDEX('#', r.Commands, r.EndPos + 1) + 1) AS EndPos, SUBSTRING(r.Commands, CHARINDEX('#', r.Commands, r.EndPos + 1) + 1, CHARINDEX('#', r.Commands, CHARINDEX('#', r.Commands, r.EndPos + 1) + 1) - CHARINDEX('#', r.Commands, r.EndPos + 1) - 1) AS ExtractedValue FROM RecursiveCTE r WHERE CHARINDEX('#', r.Commands, r.EndPos + 1) > 0 ) SELECT Commands, ExtractedValue FROM RecursiveCTE ORDER BY Commands;
方法二:STRING_SPLIT(仅适用于SQL Server 2016及以上版本)
通过替换分隔符拆分字符串,再过滤掉非目标内容:
SELECT y.Commands, TRIM(s.value) AS ExtractedValue FROM YourTable y CROSS APPLY STRING_SPLIT(REPLACE(y.Commands, '#', '|'), '|') s WHERE TRIM(s.value) <> '' AND s.value NOT IN ('SELECT', '-', 'ISNULL', 'CONVERT', 'VARCHAR(50)', '') AND CHARINDEX('+', s.value) = 0;
注意:此方法需要根据实际语句调整过滤条件,避免误删包含特殊字符的目标值。
内容的提问来源于stack exchange,提问作者Vinicius Andrade
相关产品推荐
相关产品推荐

