【问题标题】:Leading zeros after getting numeric part of string获取字符串的数字部分后前导零
【发布时间】:2018-10-10 09:28:15
【问题描述】:

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')

它不起作用。

【问题讨论】:

  • Regex 可能是最好的,或者至少是非常合适的工具,但是 SQL Server 没有太多的 regex 支持。我可能会尝试在 SQL Server 之外处理这个问题。
  • @graphene 你好,看看T H I S
  • 提供的链接只给出了数字部分,我在选择部分已经有了。我还需要前导零。
  • @graphene 你没有解释你想要什么,或者问题是什么。一方面,FORMAT 不适用于字符串。您必须先将 CAST 该字符串发送到 int

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


【解决方案1】:

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

【讨论】:

  • 有一个问题:例如,它将忽略带有 8746 的代码。我在上面又加了一个例子。
  • @graphene,我在我的机器上运行了代码,我得到了008746 而不是NULL。让我看看我能不能弄清楚你为什么收到NULL
【解决方案2】:

您可以对padding leading zeros in SQL使用复制功能

请查看 USD 函数 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')

【讨论】:

  • 当我使用 UPDATE table_A SET Code=(select dbo.fnUdfLeftSQLPadding(Code,6,'0') FROM Table_A) 时出现错误(是的,我首先创建了函数)。我不能使用 TOP 1,因为它会用 033404 更新所有行。
  • @graphene 这是查询本身的问题。没有理由在 FORMAT 中使用 SELECT
  • 我添加了第二个查询和第二个名为 udfLeftSQLPadding 的函数,它删除非数字值并仅获取数字数据
【解决方案3】:

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

【讨论】:

  • @graphene 它返回00008746,不为空。我复制/粘贴了实际结果。您是否尝试过运行 this 脚本?也许您的表格包含一些看起来像 8746 但还有其他前导/尾随字符的内容?
  • 是的。这是工作。谢谢。您和 Dan Guzman 的脚本正在运行。
猜你喜欢
  • 2017-07-10
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2013-03-28
  • 2016-05-03
  • 2015-04-05
相关资源
最近更新 更多