sql - 提取具有复杂模式 SQL 的字符串的一部分
问题描述
我正在使用如下字符串:
DOT LTB TOL SP BLM 3X(35X**25.1**GR)BWY BNL
我正在尝试提取最后一个X
和G
->之间的浮点数25.1
。
在 Python 中,使用正则表达式是一项简单的任务:**[0-9]+X([0-9\.]+)G**
但我找不到在 SQL Server 中提取数据的方法:
我试图编写一个函数来定义 X 的位置和这样的)
参数:
AS
Begin
Declare @LastX as INT
Declare @LastG as INT
Declare @Diff as INT
Declare @Result as varchar(50)
Set @LastX = LEN(@Temp) - CAST(CHARINDEX('X', REVERSE(@Temp)) AS Integer)
Set @LastG = LEN(@Temp) - CAST(CHARINDEX(')', REVERSE(@Temp)) AS Integer)
Set @Diff = @LastG - @LastX
IF @Diff > 0
Set @Result = SUBSTRING(@Temp, @LastX, @Diff)
ELSE
Set @Result = 0
Return @Result
End
我的结果是5X25.1G
你能帮我解决这个问题吗?
如果您有其他建议在 SQL 中提取此值,我也愿意。
解决方案
如果它总是在 lastX
和 last之间,您可以尝试G
使用几个's。我更喜欢在andCHARINDEX
中这样做,以避免重复代码和“讨厌”的长单一表达式:FROM
APPLY
SELECT *,REVERSE(SUBSTRING(R.YourString,CI1.I+1,CI2.I-CI1.I-1))
FROM (VALUES('DOT LTB TOL SP BLM 3X(35X25.1GR)BWY BNL'))V(YourString)
CROSS APPLY(VALUES(REVERSE(V.YourString)))R(YourString)
CROSS APPLY(VALUES(NULLIF(CHARINDEX('G',R.YourString),0)))CI1(I)
CROSS APPLY(VALUES(NULLIF(CHARINDEX('X',R.YourString,CI1.I),0)))CI2(I)
顺便说一句,这个很长的表达式如下:
SELECT V.Yourstring,
REVERSE(SUBSTRING(REVERSE(V.YourString),NULLIF(CHARINDEX('G',REVERSE(V.YourString)),0)+1,NULLIF(CHARINDEX('X',REVERSE(V.YourString),NULLIF(CHARINDEX('G',REVERSE(V.YourString)),0)),0)-NULLIF(CHARINDEX('G',REVERSE(V.YourString)),0)-1))
FROM (VALUES('DOT LTB TOL SP BLM 3X(35X25.1GR)BWY BNL'))V(YourString)
尝试阅读它,玩得开心。因此,为什么APPLY
s。
推荐阅读
- django - 无法在 django 视图中从 POST 检索数据
- javascript - 未知的自定义元素:
- 您是否正确注册了组件? - tableau-api - Tableau Server 不会加载
- javascript - Chrome 开发片段:javascript 平滑滚动缓动
- java - 在 Mockito 中,有什么方法可以模拟具有需要模拟的方法和需要测试的方法的类(而不是接口)?
- openai-gym - 改变网格中周期性出现的对象的速度
- docker - 创建的 Docker 容器进程未列出
- python - python if 语句即使条件为假也会执行
- sql - 在 PostgreSQL 的 FULL OUTER JOIN 上仅在一个表上丢失的行
- angular - @HostListener 在 ngAfterViewInit 中不起作用