首页 > 解决方案 > 在特定空间实例之间提取字符串 - SQL Server

问题描述

我正在尝试从 SQL Server 中的以下字符串中提取数字。我已经查看了其他问题,但正在努力寻找一种无论空间索引如何都能捕获数字的解决方案。我的挑战是在直到数字不是静态的空格数时提取这些数字。

这些数字总是在最后一个空格实例之前和 K 之前。

Item Name
----------------------
AA BB CCC DDDD E 1.5 K
CC EEE-EEE 0.5 K
CC EEEEEEE 7 K
CC DD EEE-EEE 0.5 K
DDDD EEE 5 K
DDDD EEE EEE 0.5 K

在其他变体中,我尝试过没有运气:

SELECT LEFT(ITEMNAME, CHARINDEX(' ', ITEMNAME)), 
   LEFT(ITEMNAME, PATINDEX('%[^0-9]%', ITEMNAME)) as [Item Name]

我想要的输出是:

Item Name
---------
1.5
0.5
7
0.5
5
0.5

关于如何提取这个的任何想法?谢谢!

标签: sqlsql-servertsql

解决方案


您可以CROSS APPLY用作

SELECT *
FROM T CROSS APPLY
     (
       SELECT value
       FROM STRING_SPLIT(ItemName, ' ')
     ) TT
WHERE TRY_CAST(Value AS DECIMAL) IS NOT NULL;

现场演示

由于您确认您的字符串始终以结尾' K'并且数字在其前面,因此只需使用

SELECT *, 
       SUBSTRING(ItemName, PATINDEX('%[0-9]%', itemname), 
                 LEN(ItemName) -
                 (
                 PATINDEX('%[0-9]%', itemname)+
                 CHARINDEX('K', REVERSE(ItemName))
                 )
                 )Result
FROM T;

或者

SELECT *, 
       RIGHT(REPLACE(ItemName, ' K', ''),
             CHARINDEX(' ', REVERSE(REPLACE(ItemName, ' K', '')))-1
            ) Result
FROM T;

现场演示


推荐阅读