SQL仅从varchar中拆分数值

SQL仅从varchar中拆分数值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一列具有以下值: Column A ------------ 001 TestA 002 TestB 003 TestC 现在我只需要A列中的数值,如: 001 002 003 请在SQL中建议解决方案,如果您可以保证数字和文本之间始终有空格字符,请使用CHARINDEX和子字符串: SELECT SUBSTRING( [Column A], 1, CHARINDEX( ' ', [Column A] ) ) AS Digits FROM myTable 如果您可以保证

我有一列具有以下值:

Column A
------------
001 TestA
002 TestB
003 TestC
现在我只需要A列中的数值,如:

001
002
003

请在SQL中建议解决方案,如果您可以保证数字和文本之间始终有空格字符,请使用
CHARINDEX
子字符串

SELECT
    SUBSTRING( [Column A], 1, CHARINDEX( ' ', [Column A] ) ) AS Digits
FROM
    myTable

如果您可以保证数字和文本之间始终有空格字符,则使用
CHARINDEX
子字符串

SELECT
    SUBSTRING( [Column A], 1, CHARINDEX( ' ', [Column A] ) ) AS Digits
FROM
    myTable
  • 如果您确定,则始终只有3位数字,您可以选择:

    Select LEFT([Column A],3)
    
  • 若数字长度不是固定的,但,您将获得数字和数字之间的空间。在这种情况下,您可以使用:

    Select LEFT([Column A], CHARINDEX( ' ', [Column A]))
    
  • 如果您希望它是通用的,并且您确信您不会使用十进制(比如123.23)来计算值。然后,你可以按照下面的步骤去做

    Select LEFT([Column A], PATINDEX('%[^0-9]%', [Column A]) - 1)
    
  • 注意:如果您在这方面或这方面遇到任何问题,请回复我

  • 如果您确定,则始终只有3位数字,您可以选择:

    Select LEFT([Column A],3)
    
  • 若数字长度不是固定的,但,您将获得数字和数字之间的空间。在这种情况下,您可以使用:

    Select LEFT([Column A], CHARINDEX( ' ', [Column A]))
    
  • 如果您希望它是通用的,并且您确信您不会使用十进制(比如123.23)来计算值。然后,你可以按照下面的步骤去做

    Select LEFT([Column A], PATINDEX('%[^0-9]%', [Column A]) - 1)
    

  • 注意:如果您在这方面或这方面遇到任何问题,请回复我。

    使用一些更麻烦的示例数据:

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable 
    VALUES ('001 TestA'),('0002 TestB'),('00003 TestC'),('004TestD!!!'),
    ('5500599' ),(' 06 TestF'), ('XXX 7 TestG'), ('eight TestH'),(NULL);
    
    这仍然是简单的使用

    结果

    colA            DigitsOnly
    --------------- ----------
    001 TestA       001
    0002 TestB      0002
    00003 TestC     00003
    004TestD!!!     004
    5500599         5500599
     06 TestF       06
    XXX 7 TestG     7
    eight TestH     NULL
    NULL            NULL
    
    colA                       item
    -------------------------- -------
    001 TestA 555              001
    001 TestA 555              555
    0002 TestB 123             0002
    0002 TestB 123             123
    03 TestC 555               03
    03 TestC 555               555
    [1234][22345][335][44]...  1234
    [1234][22345][335][44]...  22345
    [1234][22345][335][44]...  335
    [1234][22345][335][44]...  44
    
    colA                              item
    --------------------------------- -----------
    $100,000.00 TestA $5.44           $100,000.00
    $100,000.00 TestA $5.44           $5.44
    $66.22 TestB 12.3456 xxx 333.00   $66.22
    $66.22 TestB 12.3456 xxx 333.00   12.3456
    $66.22 TestB 12.3456 xxx 333.00   333.00
    
    或者,您可以这样做:

    WITH myTableCTE AS 
    (
      SELECT colA, new = SUBSTRING(colA,NULLIF(PATINDEX('%[0-9]%',colA),0),100)
      FROM #myTable
    )
    SELECT colA, colA_new = SUBSTRING(new,1,COALESCE(NULLIF(PATINDEX('%[^0-9]%',new),0)-1,100))
    FROM myTableCTE;
    
    为了好玩,假设您的专栏可以有多个数字,如下所示:

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable 
    VALUES ('001 TestA 555'),('0002 TestB 123'),('03 TestC 555'),('[1234][22345][335][44]...');
    
    SELECT colA, item 
    FROM #myTable
    CROSS APPLY dbo.patternSplitCM(colA, '%[0-9]%')
    WHERE [matched] = 1;
    
    您可以这样使用:

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable 
    VALUES ('001 TestA 555'),('0002 TestB 123'),('03 TestC 555'),('[1234][22345][335][44]...');
    
    SELECT colA, item 
    FROM #myTable
    CROSS APPLY dbo.patternSplitCM(colA, '%[0-9]%')
    WHERE [matched] = 1;
    
    结果

    colA            DigitsOnly
    --------------- ----------
    001 TestA       001
    0002 TestB      0002
    00003 TestC     00003
    004TestD!!!     004
    5500599         5500599
     06 TestF       06
    XXX 7 TestG     7
    eight TestH     NULL
    NULL            NULL
    
    colA                       item
    -------------------------- -------
    001 TestA 555              001
    001 TestA 555              555
    0002 TestB 123             0002
    0002 TestB 123             123
    03 TestC 555               03
    03 TestC 555               555
    [1234][22345][335][44]...  1234
    [1234][22345][335][44]...  22345
    [1234][22345][335][44]...  335
    [1234][22345][335][44]...  44
    
    colA                              item
    --------------------------------- -----------
    $100,000.00 TestA $5.44           $100,000.00
    $100,000.00 TestA $5.44           $5.44
    $66.22 TestB 12.3456 xxx 333.00   $66.22
    $66.22 TestB 12.3456 xxx 333.00   12.3456
    $66.22 TestB 12.3456 xxx 333.00   333.00
    
    。。。而且,因为我很无聊,我们将使用PatternSplitCM提取可能的货币

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable VALUES ('$100,000.00 TestA $5.44'),('$66.22 TestB 12.3456 xxx 333.00');
    
    SELECT colA, item 
    FROM #myTable
    CROSS APPLY dbo.patternSplitCM(colA, '%[0-9.,$]%')
    WHERE [matched] = 1;
    
    结果

    colA            DigitsOnly
    --------------- ----------
    001 TestA       001
    0002 TestB      0002
    00003 TestC     00003
    004TestD!!!     004
    5500599         5500599
     06 TestF       06
    XXX 7 TestG     7
    eight TestH     NULL
    NULL            NULL
    
    colA                       item
    -------------------------- -------
    001 TestA 555              001
    001 TestA 555              555
    0002 TestB 123             0002
    0002 TestB 123             123
    03 TestC 555               03
    03 TestC 555               555
    [1234][22345][335][44]...  1234
    [1234][22345][335][44]...  22345
    [1234][22345][335][44]...  335
    [1234][22345][335][44]...  44
    
    colA                              item
    --------------------------------- -----------
    $100,000.00 TestA $5.44           $100,000.00
    $100,000.00 TestA $5.44           $5.44
    $66.22 TestB 12.3456 xxx 333.00   $66.22
    $66.22 TestB 12.3456 xxx 333.00   12.3456
    $66.22 TestB 12.3456 xxx 333.00   333.00
    

    使用一些更麻烦的示例数据:

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable 
    VALUES ('001 TestA'),('0002 TestB'),('00003 TestC'),('004TestD!!!'),
    ('5500599' ),(' 06 TestF'), ('XXX 7 TestG'), ('eight TestH'),(NULL);
    
    这仍然是简单的使用

    结果

    colA            DigitsOnly
    --------------- ----------
    001 TestA       001
    0002 TestB      0002
    00003 TestC     00003
    004TestD!!!     004
    5500599         5500599
     06 TestF       06
    XXX 7 TestG     7
    eight TestH     NULL
    NULL            NULL
    
    colA                       item
    -------------------------- -------
    001 TestA 555              001
    001 TestA 555              555
    0002 TestB 123             0002
    0002 TestB 123             123
    03 TestC 555               03
    03 TestC 555               555
    [1234][22345][335][44]...  1234
    [1234][22345][335][44]...  22345
    [1234][22345][335][44]...  335
    [1234][22345][335][44]...  44
    
    colA                              item
    --------------------------------- -----------
    $100,000.00 TestA $5.44           $100,000.00
    $100,000.00 TestA $5.44           $5.44
    $66.22 TestB 12.3456 xxx 333.00   $66.22
    $66.22 TestB 12.3456 xxx 333.00   12.3456
    $66.22 TestB 12.3456 xxx 333.00   333.00
    
    或者,您可以这样做:

    WITH myTableCTE AS 
    (
      SELECT colA, new = SUBSTRING(colA,NULLIF(PATINDEX('%[0-9]%',colA),0),100)
      FROM #myTable
    )
    SELECT colA, colA_new = SUBSTRING(new,1,COALESCE(NULLIF(PATINDEX('%[^0-9]%',new),0)-1,100))
    FROM myTableCTE;
    
    为了好玩,假设您的专栏可以有多个数字,如下所示:

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable 
    VALUES ('001 TestA 555'),('0002 TestB 123'),('03 TestC 555'),('[1234][22345][335][44]...');
    
    SELECT colA, item 
    FROM #myTable
    CROSS APPLY dbo.patternSplitCM(colA, '%[0-9]%')
    WHERE [matched] = 1;
    
    您可以这样使用:

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable 
    VALUES ('001 TestA 555'),('0002 TestB 123'),('03 TestC 555'),('[1234][22345][335][44]...');
    
    SELECT colA, item 
    FROM #myTable
    CROSS APPLY dbo.patternSplitCM(colA, '%[0-9]%')
    WHERE [matched] = 1;
    
    结果

    colA            DigitsOnly
    --------------- ----------
    001 TestA       001
    0002 TestB      0002
    00003 TestC     00003
    004TestD!!!     004
    5500599         5500599
     06 TestF       06
    XXX 7 TestG     7
    eight TestH     NULL
    NULL            NULL
    
    colA                       item
    -------------------------- -------
    001 TestA 555              001
    001 TestA 555              555
    0002 TestB 123             0002
    0002 TestB 123             123
    03 TestC 555               03
    03 TestC 555               555
    [1234][22345][335][44]...  1234
    [1234][22345][335][44]...  22345
    [1234][22345][335][44]...  335
    [1234][22345][335][44]...  44
    
    colA                              item
    --------------------------------- -----------
    $100,000.00 TestA $5.44           $100,000.00
    $100,000.00 TestA $5.44           $5.44
    $66.22 TestB 12.3456 xxx 333.00   $66.22
    $66.22 TestB 12.3456 xxx 333.00   12.3456
    $66.22 TestB 12.3456 xxx 333.00   333.00
    
    。。。而且,因为我很无聊,我们将使用PatternSplitCM提取可能的货币

    IF OBJECT_ID('#myTable') IS NOT NULL DROP TABLE #myTable;
    CREATE TABLE #myTable (colA varchar(100));
    INSERT #myTable VALUES ('$100,000.00 TestA $5.44'),('$66.22 TestB 12.3456 xxx 333.00');
    
    SELECT colA, item 
    FROM #myTable
    CROSS APPLY dbo.patternSplitCM(colA, '%[0-9.,$]%')
    WHERE [matched] = 1;
    
    结果

    colA            DigitsOnly
    --------------- ----------
    001 TestA       001
    0002 TestB      0002
    00003 TestC     00003
    004TestD!!!     004
    5500599         5500599
     06 TestF       06
    XXX 7 TestG     7
    eight TestH     NULL
    NULL            NULL
    
    colA                       item
    -------------------------- -------
    001 TestA 555              001
    001 TestA 555              555
    0002 TestB 123             0002
    0002 TestB 123             123
    03 TestC 555               03
    03 TestC 555               555
    [1234][22345][335][44]...  1234
    [1234][22345][335][44]...  22345
    [1234][22345][335][44]...  335
    [1234][22345][335][44]...  44
    
    colA                              item
    --------------------------------- -----------
    $100,000.00 TestA $5.44           $100,000.00
    $100,000.00 TestA $5.44           $5.44
    $66.22 TestB 12.3456 xxx 333.00   $66.22
    $66.22 TestB 12.3456 xxx 333.00   12.3456
    $66.22 TestB 12.3456 xxx 333.00   333.00
    

    如果列中的值一致,即前3个字符为数字,后接
    空格
    ,则可以应用
    子字符串
    函数获取输出。@dai quick one,在执行类似运算的格式化代码时,如何通过“编辑必须为6个字符”规则?或者它不适用于2k+rep用户?@CaiusJard您需要更多的声誉。如果列中的值是一致的,即前3个字符是数字,后接
    空格
    ,那么您可以应用
    子字符串
    函数来获得输出。@dai quick one,您如何通过“编辑必须是6个字符”呢执行类似op的格式化代码时的规则?还是不适用于2k+rep用户?@CaiusJard你需要更多的声誉。数字和文本之间总是有一个空格。谢谢:)在数字和文本之间总是有一个空格。谢谢:)