我有一个包含以下值的列:
{ path: '', redirectTo: '/public', pathMatch: 'full' }
现在我只想要列A中的数值:
Column A
------------
001 TestA
002 TestB
003 TestC
请在SQL中建议一个解决方案
答案 0 :(得分:3)
如果您确定,那么总会有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)
注意:如果您在此处或此处遇到任何问题,请回复我。
答案 1 :(得分:1)
如果您可以保证数字与文字之间始终存在空格字符,请将CHARINDEX
与SUBSTRING
一起使用:
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