【问题标题】:SQL take just the numeric values from a columnSQL 只取列中的数值
【发布时间】:2020-02-08 02:49:43
【问题描述】:

我在一列中有以下数据:

aud_344266_jayde_adams
int_343581_jtou_s5_ep1
of_344289_geordie_s21_rig_c
soft_343726_24hrpc_s4_norbiton
on_334195_sas_s5_1007_1008

我只想返回以下内容:

344266
343581
344289
343726
334195

如您所见,我想返回的数字中有一个模式。它们必须在其前后加上下划线,并且长度也为 6 个字符。

在 SQL Server 中有没有办法做到这一点?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008


    【解决方案1】:

    对于您的示例数据,这是可行的:

    select left(stuff(t.col, 1, patindex('%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%', t.col), ''), 6)
    

    或者更简单:

    select substring(t.col, patindex('%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%', t.col) + 1, 6)
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 我只是想让 patindex 更具体一点 patindex('%[0-9][0-9][0-9][0-9][0-9][0 -9]%',col) +1
    • @JohnCappelletti 或 '%[_][0-9][0-9][0-9][0-9][0-9][0-9][_]%' 因为 OP 声明值周围必须有下划线。您的模式可以在超过 6 位数字的字符串中找到匹配项。
    • @HABO 我后来也这么想,但我错过了我的编辑窗口:)
    • @JohnCappelletti 。 . .我完全同意你和 HABO 的看法。我已经调整了答案。
    • @user9167864 你应该接受这个答案对你有帮助stackoverflow.com/help/someone-answers
    【解决方案2】:

    你可以使用left、right和charindex函数

    示例:

    declare @row as varchar(100) = 'aud_344266_jayde_adams'
    
    select @row,  right(@row, len(@row)-charindex('_',@row)), left(right(@row, len(@row)-charindex('_',@row)),-1 + charindex('_',right(@row, len(@row)-charindex('_',@row))))
    

    为你的桌子做:

    select left(right(_Column, len(_Column)-charindex('_',_Column)),-1 + charindex('_',right(_Column, len(_Column)-charindex('_',_Column))))
    From Tbl
    

    【讨论】:

      【解决方案3】:

      APPLY 是你的朋友。

      -- Sample Data
      DECLARE @yourtable TABLE (SomeString VARCHAR(100));
      INSERT @yourtable (SomeString) VALUES 
        ('aud_344266_jayde_adams'),('int_343581_jtou_s5_ep1'),('of_344289_geordie_s21_rig_c'),
          ('soft_343726_24hrpc_s4_norbiton'),('on_334195_sas_s5_1007_1008');
      
      -- Solution
      SELECT      TheNumber = SUBSTRING(t.SomeString,d1.Pos,d2.Pos-d1.Pos)
      FROM        @yourtable AS t
      CROSS APPLY (VALUES(CHARINDEX('_',t.SomeString)+1))      AS d1(Pos)
      CROSS APPLY (VALUES(CHARINDEX('_',t.SomeString,d1.Pos))) AS d2(Pos);
      

      返回:

      TheNumber
      ----------
      344266
      343581
      344289
      343726
      334195
      

      【讨论】:

        【解决方案4】:

        您可以使用SUBSTRING 结合CHARINDEX 来实现它

        select substring(value, CHARINDEX('_', value) + 1, 6)
        from TempTable
        

        Demo on db<>fiddle

        输出

        344266
        343581
        344289
        343726
        334195
        

        【讨论】:

        猜你喜欢
        • 2021-10-05
        • 2010-10-29
        • 2021-11-21
        • 1970-01-01
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        相关资源
        最近更新 更多