【发布时间】:2018-05-09 20:19:24
【问题描述】:
我有一个表格,上面有一些我想解析出来的文本,我非常接近解决方案,但它并不完全存在。我有一个名为 indicatornumerator 的列,我想解析出类似于下面的内容,即我想将方括号之间的每个值都放到一个新行上。正如您从下面的输出中看到的那样,我在减号之后得到了第一个值的重复。这不会发生在那些没有减号的人身上。
我的功能如下:
alter function fn_breakdown (@string varchar(max))
returns @breakdown table
(
originalstr varchar(max),
breakdownstr varchar(max)
)
as
begin
while charindex('r',@string,1) >0
begin
insert into @breakdown
select @string,
SUBSTRING(@string,CHARINDEX('r',@string,1),CHARINDEX(']',@string,1)-CHARINDEX('r',@string,1))
set @string = right(@string,len(@string)-CHARINDEX(')',@string,1))
end
return
end
我想做的第二件事是将减号之后的那些作为负值返回,而不是例如。 -R101 而不是 R101,因为我需要稍后减去这些值。
非常感谢任何帮助
下面应该创建一个临时表,并将显示我得到的输出。您会看到其中一行重复。我希望在指标分子列中以“R”开头的每个值都有一行
创建表 #temped2 ( 指标分子 varchar(max) )
插入#temped2 选择'(SUM([R4]) + SUM([R1010])) - (SUM([R1035]) + SUM([R1034]))'
从 #temped2 中选择 * 交叉应用 fn_breakdown(indicatornumerator)
【问题讨论】:
-
请举例说明预期的输出。
-
请指定您的关系型数据库
-
示例输出在屏幕截图中。左边是原始字符串,右边是所需的输出。我希望将原始字符串解析为单独的行,但正如您在屏幕截图中看到的那样,有些是重复的。我也在使用 SQL Server 2017
-
不要发布截图。发布 DML。
-
对于您的第一个问题,请尝试将
SET中的 ')' 替换为 ']'。对于第二个问题,您可能想要搜索算术表达式的解析并从中获取原子。因为这实际上就是您在这里尝试做的事情。但请注意,您的括号是不平衡的。我认为IndicatorNumerator的开头缺少一个'('。
标签: sql sql-server function tsql