我在这里找到了一些相关的例子,但没有专门针对这种情况。这里是:
我需要使用 SQL 来解析来自管道分隔的平面文件的数据。其中一个字段的子格式如下。我的最终状态是对字段内的整数求和,但我的问题是查看使用 SQL SELECT 来解析/提取整数的方法。子格式的模式始终是所需整数前面有波浪号 (~) 后跟星号 (*)。子字段的数量也可能有所不同(我的示例有 5 个,但可以更多或更少)。 4 个字符的 TAG 名称并不重要。
这是一个示例:
|GADS~55.0*BILK~0.0*BOBB~81.0*HETT~32.0*IGGR~51.0|
在这个例子中,我想要处理的只是最终的数字 219。同样,我可以将求和部分作为进一步的步骤;只是对获取数字感兴趣。
我知道如何使用 UNIX 工具(即 AWK、sed 等)轻松处理这个问题,但不知道如何使用 SQL。任何建议都会有所帮助!谢谢!
最佳答案
这将返回 219:
- 在 Cut1 中,我让字符串以第一个数字开始。
- 在 Cut2 中,我切割了最后一个管道并添加了一个星号
- 在 Splitted 中,我将 ~ 替换为 XML 标记,从而可以轻松拆分字符串
- 在最后的 Select 中,将纯数字相加...
现在是代码
DECLARE @str VARCHAR(100) = '|GADS~55.0*BILK~0.0*BOBB~81.0*HETT~32.0*IGGR~51.0|';
WITH Cut1 AS
(
SELECT SUBSTRING(@str,CHARINDEX('~',@str,1)+1,1000) AS c1
)
,Cut2 AS
(
SELECT SUBSTRING(Cut1.c1,1,LEN(Cut1.c1)-1) + '*' AS c2 FROM Cut1
)
,Splitted AS
(
SELECT CAST('<x>' + REPLACE(Cut2.c2,'~','</x><x>') + '</x>' AS XML) AS AsXML FROM Cut2
)
SELECT SUM(CAST(SUBSTRING(numbers.value('.','varchar(100)'),1,CHARINDEX('*',numbers.value('.','varchar(100)'),1)-1) AS FLOAT))
FROM Splitted
CROSS APPLY AsXML.nodes('/x') AS the(numbers)
关于sql-server - 解析带有多个分隔符的整数值的 SQL 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925120/