sql-server - 解析带有多个分隔符的整数值的 SQL 字符串

标签 sql-server t-sql parsing

我在这里找到了一些相关的例子,但没有专门针对这种情况。这里是:

我需要使用 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/

相关文章:

python - 如何将 python 代码转换为解析树并返回原始代码?

asp.net - 如何在 ASP.NET 中使用数据库连接字符串?

sql - 多个 SQL Select 具有不同的位置到一个 Select 中

c# - 如何在 asp.net 中停止页面加载时的数据绑定(bind)

sql-server - 在大型数据库中搜索特定 ID?

sql-server - 如何将数据从 Common Data Service 复制到 Azure 上的 SQL Server?

sql - 使用 SELECT TOP 时出现转换失败错误,但选择所有行时没有错误

java - 我正在Android Studio中进行编码,因此我需要从特定网页中获取并显示特定的数据行

c# - Sprache 中的递归表达式解析

sql - 如何在SQL中找到上下第一个最近的值?