提取具有复杂模式的字符串的一部分 SQL
Extract a part of string with complex pattern 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服务器中提取数据的方法:
我尝试编写一个定义 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 中提取此值,我也很乐意接受。
如果在最后一个 X
和最后一个 G
之间总是 ,您可以使用几个 CHARINDEX
尝试过。我更喜欢在 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.
我正在使用如下字符串:
DOT LTB TOL SP BLM 3X(35X**25.1**GR)BWY BNL
我正在尝试提取最后一个 X
和 G
之间的浮点数 -> 25.1
.
在 Python 中使用正则表达式很容易:**[0-9]+X([0-9\.]+)G**
但是我找不到在SQL服务器中提取数据的方法:
我尝试编写一个定义 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 中提取此值,我也很乐意接受。
如果在最后一个 X
和最后一个 G
之间总是 ,您可以使用几个 CHARINDEX
尝试过。我更喜欢在 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.