【问题标题】:SQL Select between two spaces or everything after first if only oneSQL 在两个空格或第一个之后的所有内容之间选择,如果只有一个
【发布时间】:2016-02-26 16:29:04
【问题描述】:

我有一列包含一个组的描述,每一行看起来就像下面两个选项中的一个,用不同数量的单词和/或数字代替 blah:

bla1h bla2h blah blah Group 18956
blah bl4ah blah Group 189 bla5h

我需要提取词组后面的数字。

我想出了这个代码:

SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20)

这将修剪它以下之一:

Group 18956
Group 189 blah

在此之后,我需要进一步修剪它,以便我能够提出以下代码,这要感谢This post

LEFT(SUBSTRING(SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20),CHARINDEX(' ',SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20)) +1,LEN(SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20))),CHARINDEX(' ',SUBSTRING(SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20), CHARINDEX(' ', SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20)) +2, LEN(SUBSTRING(R.GroupDescription,CHARINDEX('Group ',R.GroupDescription),20)))))

这段代码既麻烦又只适用于上面第一个例子中的第二个例子,在我想要的数字集之后什么都没有它什么都不返回。

另外真正有趣的部分是返回的结果将需要连接到另一个表。

我正在使用带有 SQL Server 2012 后端的 SSMS 2012。

【问题讨论】:

    标签: sql-server-2012 substring


    【解决方案1】:

    假设有一个Group 总是后跟一个数字:

    ;WITH R(GroupDescription) AS (
        SELECT 'blah blah blah blah Group 18956' UNION
        SELECT 'blah blah blah Group 189 blah' 
    )
    SELECT LEFT(T.F, CHARINDEX(' ', T.F + ' ') - 1) VAL
    FROM (SELECT
        SUBSTRING(R.GroupDescription, CHARINDEX('Group ',R.GroupDescription) + 6, LEN(R.GroupDescription)) F
        FROM R) T
    

    VAL
    18956
    189
    

    【讨论】:

    • Yes 文本字符串中只有一个 Group 会出错。但是我需要检索的信息是它后面的数字。该数字的长度可以从 4 到 7 个数字不等,我将使用该结果来形成与另一个表的连接。我无法让您的代码为我工作。不过感谢您的尝试。
    • 这可行,但我不确定如何将结果用作另一个表的连接。表 R 应该从上面的 R.results 上加入表 G = G.GroupID
    【解决方案2】:

    听起来你会受益于一个从你的长字符串中去除所有非 0-9 字符的函数。这将只留下数字,然后您可以将其加入您的表格。

    CREATE FUNCTION strip_function (@value VARCHAR(200)) 
    RETURNS VARCHAR(200)
    AS 
    BEGIN
    
    WHILE PATINDEX('%[^0-9]%', @value) > 0 
    SET @value = REPLACE(@value, SUBSTRING(@value, PATINDEX('%[^0-9]%', @value),1),'')
    
    RETURN @value 
    END 
    GO 
    
    SELECT dbo.strip_function(your_column)
    FROM your_table 
    

    【讨论】:

    • 这有帮助,但并不能完全解决它,因为在 blah 可能有数字之前我没有这么说。但是你不知道我很抱歉。我将编辑问题以将其包括在内。这个答案还是有用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多