sql-server - 使用分隔符将字符串拆分为数组,获取 SELECT 语句中倒数第二个元素

标签 sql-server t-sql

头!

在我的数据库中,我有一列包含以下数据(示例):

H-01-01-02-01

BLE-01-03-01

H-02-05-1.1-03

任务是获取数组的倒数第二个元素(如果您使用“-”字符拆分数组)。字符串的长度不同。

这就是使用上述数据的结果:

02

03

1.1

基本上,我正在寻找与以下 ruby​​ 语句等效的内容,以便在 SQL-Server 中的 Select-Statement 中使用:

"BLE-01-03-01".split("-")[-2]

这在 SQL Server 中是否可行?在花了一些时间寻找解决方案后,我只找到了适用于最后一个或第一个元素的解决方案。

非常感谢您提供任何线索或解决方案!

PS:SQL Server版本为Microsoft SQL Server 2012

最佳答案

作为替代方案,您可以尝试以下方法:.

--带有一些测试数据的模型表来模拟您的问题

DECLARE @mockupTable TABLE (ID INT IDENTITY, YourColumn VARCHAR(50));
INSERT INTO @mockupTable VALUES 
 ('H-01-01-02-01') 
,('BLE-01-03-01')
,('H-02-05-1.1-03');

--查询

SELECT CastedToXml.value('/x[sql:column("CountOfFragments")-1][1]','nvarchar(10)') AS TheWantedFragment
FROM @mockupTable t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.YourColumn,'-','</x><x>') + '</x>' AS XML))A(CastedToXml)
CROSS APPLY(SELECT CastedToXml.value('count(/x)','int')) B(CountOfFragments);

简单的想法:

第一个 APPLY 会将字符串转换为这样的 XML

<x>H</x>
<x>01</x>
<x>01</x>
<x>02</x>
<x>01</x>

第二个APPLY将对此XML进行x查询以获取片段的计数。由于 APPLY 会将其作为一列添加到结果集中,因此我们可以使用 sql:column() 使用该值通过其位置获取所需的片段。

关于sql-server - 使用分隔符将字符串拆分为数组,获取 SELECT 语句中倒数第二个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58520380/

相关文章:

sql - 使用外部表时检索文件名

sql - 从表创建花名册

sql-server - 使用 Azure Resource Mover 和 SQL Server 是否存在丢失数据的风险?

sql-server - 获取两个表的连接的不同计数

sql-server - 如何计算浮点列中小数点右侧的位数?

sql-server - 在变量中检索和使用 "FOR JSON"查询的输出

sql-server - CSV 中的 T-SQL OpenRowSet 缺少标题行

asp.net - Entity Framework 查询第一次连接和执行需要很长时间

sql - 从动态 SQL 返回的存储过程字符串参数的范围问题

sql - 如何在 SQL Server 中基于外键进行有效分区?