sql - 在特定空间实例之间提取字符串 - 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
关于如何提取这个的任何想法?谢谢!
解决方案
您可以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;
推荐阅读
- java - 服务器使用 JAX-RS 和 RESTeasy 在单个 URL 中向客户端发送“ping 请求”
- php - 仅当从具有另一个域的另一个网站重定向时才允许访问该页面
- angular - Angular 6 - RouterStateSnapshot state.url 在初始化应用程序时返回“/dashboard”
- pointers - 为什么将指向 Go bytes.Buffer 的指针传递给另一个函数时需要它?
- java - 加载本体以提取所有导入的名称空间
- c# - 如何告诉 .NET 给定的 DateTime 位于特定时区?
- java - android textfield以编程方式基于数据
- burp - Burp Extender API:如何在自定义菜单项单击时选择选定的文本
- java - 当在 tablayout 中调用其他片段时,第一个片段会出现一秒钟
- leaflet - Leaflet.Snap 捕捉不适用于 Leaflet-draw 1.0.0