【问题标题】:extract all numbers from start of string?从字符串的开头提取所有数字?
【发布时间】:2020-10-16 10:24:09
【问题描述】:

我有一个表,其中包含一些我正在尝试清理的不良数据。

字段示例如下

36234735HAN876

2342JOE9823

554444PUT003

我想要做的是删除第一个字母字符之前的所有数字字符,使其如下所示:

HAN876

JOE9823

PUT003

实现这一目标的最佳方法是什么?我使用了以下方法,但这只能用于从字符串中提取所有数字,而不是字母字符之前的数字

How to get the numeric part from a string using T-SQL?

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:

    您可以使用PATINDEX 来定位字符串中字母字符的第一个位置,然后使用SUBSTRING 仅返回该位置之后的字符:

    CREATE TABLE #temp (val VARCHAR(50));
    INSERT INTO #temp VALUES ('36234735HAN876'), ('2342JOE9823'), ('554444PUT003'), ('TEST1234');
    
    SELECT  val,
            SUBSTRING(val, PATINDEX('%[A-Z]%', val), LEN(val)) AS output
      FROM  #temp;
    
    DROP TABLE #temp;
    

    输出:

    val             output
    36234735HAN876  HAN876
    2342JOE9823     JOE9823
    554444PUT003    PUT003
    TEST1234        TEST1234
    

    请注意,我创建了一个临时表,其中包含一个名为 val 的列。您应该更改它以使用实际调用的任何列。

    关于区分大小写:如果您使用不区分大小写排序规则,这将毫无问题。如果您的排序规则区分大小写,那么您可能需要更改匹配的模式以适应大小写字母。

    【讨论】:

      【解决方案2】:

      使用PATINDEX 查找第一个非数字字符(或第一个字母字符,取决于逻辑)并使用STUFF 删除它们:

      SELECT STUFF(V.YourString,1,ISNULL(NULLIF(PATINDEX('%[^0-9]%',V.YourString),0)-1,0),'')
      FROM (VALUES('36234735HAN876'),
                  ('2342JOE9823'),
                  ('554444PUT003'),
                  ('ABC123'))V(YourString)
      

      如果逻辑是第一个字母字符,而不是第一个非数字字符,则模式将为[A-z]

      NULLIFISNULL 用于当/如果字符串以 alpha/非数字开头,因此不会由于第三个参数为 -1 而导致 STUFF 出错。通过我放入示例数据 ('ABC123') 的附加示例进行了演示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多