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')
它不起作用。
答案 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