提取具有复杂模式的字符串的一部分 SQL

Extract a part of string with complex pattern SQL

我正在使用如下字符串:

DOT LTB TOL SP BLM 3X(35X**25.1**GR)BWY BNL

我正在尝试提取最后一个 XG 之间的浮点数 -> 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)

祝您阅读愉快。因此,为什么 APPLYs.