我是stackoverflow的新手,但我经常搜索它。
我正在从数据创建一个报告,其中我必须格式化负数,例如,
-00000010 (9 characters max)
我得到了这个, 000000-10
这就是我现在正在尝试的,但我遇到了问题。任何帮助将不胜感激。
SELECT 'H'
+ DG.BLOCK
+ LEFT(DG.ZIP,5)
+ RIGHT('000000000'
+ CAST(CAST(SUM(DG.WP)AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(SUM(DG.WE)AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(SUM(DG.EP)AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(SUM(DG.EE)AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(COUNT(DGG.CLAIMCONTROL)AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(SUM(DGG.INC) AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(SUM(DGG.PAID)AS INT) AS VARCHAR(9)),9)
+ RIGHT('000000000' + CAST(CAST(SUM(DGG.ALAE) AS INT) AS VARCHAR(9)),9)
AS [H Record]
FROM TABLE
如果是 2012+,你可以选择 Format((。
例
Select replace(format(-1,' 000000000'),'- ','-')
返回
-000000001 If number was negative
000000001 If number was positive
只是提醒一句。 Format(( 有一些很棒的功能,但不知道它是一个高性能的。
下面的代码演示如何将数据的格式设置为 9 位数字加上可选符号或固定的 9 个字符(包括符号(。
-- Sample data.
declare @Samples as Table ( Sample Int );
insert into @Samples ( Sample ) values ( 0 ), ( 1 ), ( -10 ), ( 100 ), ( -1000 );
-- Format the data.
select Sample,
case when Sign( Sample ) = -1 then '-' else '' end +
Right( Replicate( '0', 8 ) + Cast( Abs( Sample ) as VarChar(9) ), 9 ) as FormattedSample9PlusSign,
case when Sign( Sample ) = -1 then
'-' + Right( Replicate( '0', 7 ) + Cast( -Sample as VarChar(8) ), 8 ) else
Right( Replicate( '0', 8 ) + Cast( Sample as VarChar(9) ), 9 ) end as FormattedSample9
from @Samples;
提示: 在 SSMS 中使用查询结果到文本(Ctrl-T( 以便更方便地显示。
如果你没有 v2012+,你可以试试这个:
DECLARE @mockup TABLE(SomeNumber INT);
DECLARE @padWidth INT=3;
INSERT INTO @mockup VALUES(-1000),(-500),(-1),(0),(1),(500),(1000);
SELECT CASE WHEN m.SomeNumber < 0 THEN '-' ELSE ' ' END
+ REPLACE(STR(ABS(m.SomeNumber),@padWidth),' ','0')
FROM @mockup AS m;
数字,很大,将返回为***
。这比其他用RIGHT
或LEFT
切割琴弦的方法要好。他们可能会返回一个不好的结果...
这是返回的
-***
-500
-001
000
001
500
***
在 DB2 中,这适用于获取包含符号的 15 位数字:
CASE WHEN MYNUMBER < 0 THEN '-' || LPAD(MYNUMBER , 14, 0)
ELSE LPAD(MYNUMBER , 15, 0)
END