首页 > 解决方案 > 提取具有复杂模式 SQL 的字符串的一部分

问题描述

我正在使用如下字符串:

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

我正在尝试提取最后一个XG->之间的浮点数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 中提取此值,我也愿意。

标签: sqlsql-serverstringfunctionwildcard

解决方案


如果它总是在 lastX和 last之间,您可以尝试G使用几个's。我更喜欢在andCHARINDEX中这样做,以避免重复代码和“讨厌”的长单一表达式:FROMAPPLY

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。


推荐阅读