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你需要更多的声誉。数字和文本之间总是有一个空格。谢谢:)在数字和文本之间总是有一个空格。谢谢:)