SQL仅拆分varchar中的数值

时间:2017-08-04 05:04:24

标签: sql sql-server tsql

我有一个包含以下值的列:

{ path: '', redirectTo: '/public', pathMatch: 'full' }

现在我只想要列A中的数值:

Column A
------------
001 TestA
002 TestB
003 TestC

请在SQL中建议一个解决方案

3 个答案:

答案 0 :(得分:3)

  1. 如果您确定,那么总会有3位数字,您可以使用:

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

    Select LEFT([Column A], CHARINDEX( ' ', [Column A]))
    
  3. 如果你想要它是通用的,你确定你不会用十进制值(如123.23)。然后,您可以使用以下内容;

    Select LEFT([Column A], PATINDEX('%[^0-9]%', [Column A]) - 1)
    
  4. 注意:如果您在此处或此处遇到任何问题,请回复我。

答案 1 :(得分:1)

如果您可以保证数字与文字之间始终存在空格字符,请将CHARINDEXSUBSTRING一起使用:

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

答案 2 :(得分:0)

使用一些更麻烦的样本数据:

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);

使用DigitsOnlyEE仍然很简单。

SELECT * 
FROM #myTable
CROSS APPLY dbo.DigitsOnlyEE(colA);

<强>结果:

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

或者你可以这样做:

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]...');

您可以像这样使用PatternSplitCM

SELECT colA, item 
FROM #myTable
CROSS APPLY dbo.patternSplitCM(colA, '%[0-9]%')
WHERE [matched] = 1;

<强>结果:

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

...而且,因为我很无聊,我们会使用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                              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