【问题标题】:How can I add leading 0's to a char?如何将前导 0 添加到字符?
【发布时间】:2017-05-23 20:18:25
【问题描述】:

我正在为客户编写导出文件,他们要求每列的长度恰好为 10 个字符。在 exoprt 我有一个格式为 char(10) 的列,它是我们的发票号,但只有 6 个字符长,所以我需要添加 3 个前导 0。这是我尝试过的:

SELECT '000'+invno, invdte, '000'+item, brnkcomp, tqtyshp,price, bextpri, descrip
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN ('10120','1000290','30234','10491','10747','21449')

但结果总是在 0 和发票编号之间有一个空格。我没有空间。

000   6325290
000   6325301
000   6325331
000   6325357
000   6325369
000   6325400

我也试过这个,结果是在 0 和发票 # 之间有一个空格

SELECT LEFT('000'+CAST(invno AS VARCHAR(15)),15) 
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN ('10120','1000290','30234','10491','10747','21449')

000   6325290
000   6325301
000   6325331
000   6325357
000   6325369
000   6325400

我希望输出看起来像这些结果:

0006325290
0006325301
0006325331
0006325357
0006325369
0006325400

我在 SSRS 中运行此导出,因此如果有一种方法可以更轻松地执行此操作,我也可以这样做。谢谢!

【问题讨论】:

  • invno的类型是什么?
  • char = 固定长度和带空格的填充 varchar = 可变长度无空格...所以如果你想添加 000 的 RIGHT('0000000000'+ISNULL(trim(field),''), 10)
  • 就是这样....感谢 xQBert!

标签: sql sql-server reporting-services sql-server-2008-r2


【解决方案1】:

您可以使用 Format(column, 'D10') 如下

 SELECT Format(invno, 'D10') as InvNo, invdte, '000'+item, brnkcomp, tqtyshp,price, bextpri, descrip
 FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN 
  ('10120','1000290','30234','10491','10747','21449')

另一种方法是做正确的演员:

SELECT RIGHT('0000000000'+CAST(InvNo AS VARCHAR(10)),10)...

【讨论】:

  • 虽然 FORMAT 很棒,但它确实会对性能产生影响,并且您的第二种 RIGHT(... 方法将大大优于其他建议。
【解决方案2】:

FORMAT 函数仅在 SQL Server 2012 及更高版本中可用。所以这在 SQL Server 2008 R2 中对你不起作用。

我认为您尝试过的问题是您在invno 中有前导空格。使用LTRIM 删除它们,并且可以使用RTRIM 删除任何尾随空格。然后用零填充你的值,只需将它们连接到左侧,然后取你想要的最右边的字符数。在您的情况下,10。如果您绝对确定要处理的值始终是一组字符,则只需添加所需的数字即可。但是,我在这里展示的方法将考虑原始值的不同长度。

SELECT RIGHT('0000000000' + LTRIM(RTRIM(invno)), 10) as InvNo, invdte, '000'+item, brnkcomp, tqtyshp,price, bextpri, descrip
FROM artran a
LEFT JOIN arcust b ON a.custno = b.custno
WHERE invdte BETWEEN DATEADD("d",-7,GETDATE()) and GETDATE() AND item IN 
  ('10120','1000290','30234','10491','10747','21449')

诺埃尔

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多