获取字符串的数字部分后的前导零

时间:2018-10-10 09:28:16

标签: sql sql-server sql-server-2012

SQL Server 2012。 需要获得包含6个数字的数字部分,如果没有足够的数字填充前导零。 代码是nvarchar类型。

TABLE_A更新之前

Id  Code
1  s33404tft 
2  dd345ui
3  456567t
4  8746

TABLE_A更新后

Id  Code
1  033404
2  000345
3  456567
4  008746   

sql脚本:

 Update table_A
    SET Code=FORMAT((SELECT SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1) AS Number 
              FROM Table_A),'000000')

它不起作用。

3 个答案:

答案 0 :(得分:3)

一种方法是连接前导零并使用RIGHT提取所需的值:

UPDATE table_A
SET Code =
    RIGHT('000000' + SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1), 6)
    FROM Table_A;

答案 1 :(得分:2)

您可以将复制功能用于padding leading zeros in SQL

请检查参考文件中的美元函数udfLeftSQLPadding 然后您可以按以下格式使用它:

select dbo.udfLeftSQLPadding('12345',6,'0')

另外,要仅获取数字值,可以使用我在Remove Non-Numeric Character共享的ClearNonNumericCharacters UDF

所以您的脚本将如下所示

Update table_A
set 
Code = dbo.udfLeftSQLPadding( dbo.ClearNonNumericCharacters(Code), 6, '0')

答案 2 :(得分:1)

FORMAT不适用于文本类型。提取的数字部分必须首先转换为整数才能设置其格式,例如:

update Table_A
set code=FORMAT(cast( SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1) 
                      as int)
                ,'00000000')

例如:

declare @table_A table (ID int, Code nvarchar(20))
insert into @table_A (ID,Code)
values
(1,'s33404tft'),
(2,'dd345ui'),
(3,'456567t'),
(4,'8746');

update @table_A
set code=FORMAT(cast(SUBSTRING(code, PATINDEX('%[0-9]%', code), PATINDEX('%[0-9][^0-9]%', code + 't') - PATINDEX('%[0-9]%', code) + 1) as int)
                ,'00000000')


select * from @table_A

产生:

ID  Code
1   00033404
2   00000345
3   00456567
4   00008746