Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取字符串的数字部分后的前导零_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

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

Sql 获取字符串的数字部分后的前导零,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,SQL Server 2012。 需要得到6个数字的数字部分,如果没有足够的数字填充前导零。 代码是nvarchar类型 更新前的表A Id Code 1 s33404tft 2 dd345ui 3 456567t 4 8746 更新后的表A Id Code 1 033404 2 000345 3 456567 4 008746 sql脚本: Update table_A SET Code=FORMAT((SELECT SUBSTRING(code, P

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

更新前的表A

Id  Code
1  s33404tft 
2  dd345ui
3  456567t
4  8746
更新后的表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')

它不起作用

您可以使用复制功能

请检查USD函数UDFLEFTSQLPADING的参考文档 然后您可以使用以下格式:

select dbo.udfLeftSQLPadding('12345',6,'0')
此外,要仅获取数值,您可以使用ClearNonNumericCharacters UDF,我在这里共享了

所以你的脚本如下

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

您可以使用replicate函数

请检查USD函数UDFLEFTSQLPADING的参考文档 然后您可以使用以下格式:

select dbo.udfLeftSQLPadding('12345',6,'0')
此外,要仅获取数值,您可以使用ClearNonNumericCharacters UDF,我在这里共享了

所以你的脚本如下

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

一种方法是连接前导零并使用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;

一种方法是连接前导零并使用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;
格式不适用于文本类型。必须先将提取的数字部分转换为整数才能对其进行格式化,例如:

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
格式不适用于文本类型。必须先将提取的数字部分转换为整数才能对其进行格式化,例如:

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


Regex可能是实现这一点的最佳工具,或者至少是非常合适的工具,但是SQLServer没有太多的Regex支持。我可能会尝试在SQL Server之外处理此问题。@graphene您好,请查看提供的链接,它只提供数字部分,我已经在“选择”部分中提供了数字部分。我还需要前导零。@graphene你没有解释你想要什么,或者问题是什么。首先,格式不适用于字符串。您必须将该字符串转换为int firstRegex可能是最好的,或者至少是非常合适的工具,但是SQL Server没有太多的regex支持。我可能会尝试在SQL Server之外处理此问题。@graphene您好,请查看提供的链接,它只提供数字部分,我已经在“选择”部分中提供了数字部分。我还需要前导零。@graphene你没有解释你想要什么,或者问题是什么。首先,格式不适用于字符串。当我使用UPDATE table_A SET Code=select dbo时,必须首先将该字符串转换为int。fnUdfLeftSQLPaddingCode,6,'0'来自表_A给出一个错误是的,我首先创建了函数。我不能使用TOP 1,因为它会用033404更新所有行。@graphene这是查询本身的问题。没有理由在格式中使用SELECT。我添加了第二个查询和第二个名为UDFLETSQLPADING的函数,该函数在使用UPDATE table_a SET Code=SELECT dbo时删除非数值并仅获取数值数据。fNUDFETSQLPADINGCODE,6,表中的“0”给出了一个错误。是的,我首先创建了该函数。我不能使用TOP 1,因为它会用033404更新所有行。@graphene这是查询本身的问题。没有理由在格式中使用SELECT。我添加了第二个查询和第二个名为UDFLETSQLPADING的函数,该函数删除非数值并仅获取数值数据。有一个问题:它将忽略代码(例如8746)。我在上面又添加了一个例子。@graphene,我在我的机器上运行了代码,得到的是008746而不是NULL。让我看看我是否能找出为什么会得到NULL。有一个问题:它会忽略8746代码。我在上面又添加了一个例子。@graphene,我在我的机器上运行了代码,得到的是008746而不是NULL。让我看看我是否能找出为什么会得到NULL。@graphene它返回00008746,而不是NULL。我复制/粘贴了实际结果。你试过运行这个脚本吗?可能您的表包含看起来像8746但有其他前导/尾随字符的内容?是的。它正在工作。谢谢您的和Dan Guzman脚本正在工作。@graphene它返回00008746,不是空值。我复制/粘贴了实际结果。你试过运行这个脚本吗?可能您的表包含看起来像8746但有其他前导/尾随字符的内容?是的。它正在工作。谢谢你的和丹·古兹曼的脚本正在运行。