自定义数字序列格式
Custom number sequence formatting
我正在使用的系统有一个编号系统,其中数字 0-999
由通常的 0-999
表示,但 1000
由 A00
表示,后跟通过 A01
、A02
、A03
等,1100
成为 B00
等
我想不出一种方法来在 T-SQL 中处理这个问题而不诉诸于使用巨大的 case 语句检查单个数字,并且必须有比这更好的方法。我曾考虑过使用十六进制,但那是不对的。
DECLARE @startint int = 1,
@endint int = 9999;
;WITH numbers(num)
AS
(
SELECT @startint AS num
UNION ALL SELECT num+1 FROM numbers
WHERE num+1 <= @endint
)
SELECT num, convert(varbinary(8), num) FROM [numbers] N
OPTION(MAXRECURSION 0)
有了这个 999
现在 3E7
,它应该只是 999
.
这目前产生这个:
Number Sequence
0 0x00000000
1 0x00000001
...
10 0x0000000A
...
100 0x00000064
...
999 0x000003E7
1000 0x000003E8
我在找什么:
Number Sequence
0 000
1 001
...
10 010
11 011
12 012
...
999 999
1000 A00
1001 A01
...
1099 A99
1100 B00
1101 B01
1200 C00
我需要这个才能在 SQL Server 2008 中工作。
您可以使用整数除法和取模来将百位和十位分开。
之后,您可以将商加 64 以获得从 A
.
开始的 ASCII 值
create function function dbo.fn_NumToThreeLetters(@num integer)
RETURNS nchar(3)
AS
begin
RETURN (SELECT (case
when @num/1000 >0 then
CHAR(( (@num-900)/100) +64)
+ replace(cast( @num %100 as nchar(2)),' ','0')
else cast(@num as nvarchar(3))
end)
)
END
select dbo.fn_NumToThreeLetters(1100)
-------
B00
select dbo.fn_NumToThreeLetters(999)
-------
999
第一个 when
子句确保仅当数字大于 1000 时才应用转换。如果是,减去 900 然后除以 100,所以我们得到一个从 1 开始的数字,表示 1000, 2 表示 1100,等等
将其加64得到一个从A开始的ASCII码并转换回CHAR
的字符。
余数只需要转换为2位nchar,其中空格替换为0
。
这最多只能工作到 3500。问题没有具体说明应该如何处理更大的数字
我正在使用的系统有一个编号系统,其中数字 0-999
由通常的 0-999
表示,但 1000
由 A00
表示,后跟通过 A01
、A02
、A03
等,1100
成为 B00
等
我想不出一种方法来在 T-SQL 中处理这个问题而不诉诸于使用巨大的 case 语句检查单个数字,并且必须有比这更好的方法。我曾考虑过使用十六进制,但那是不对的。
DECLARE @startint int = 1,
@endint int = 9999;
;WITH numbers(num)
AS
(
SELECT @startint AS num
UNION ALL SELECT num+1 FROM numbers
WHERE num+1 <= @endint
)
SELECT num, convert(varbinary(8), num) FROM [numbers] N
OPTION(MAXRECURSION 0)
有了这个 999
现在 3E7
,它应该只是 999
.
这目前产生这个:
Number Sequence
0 0x00000000
1 0x00000001
...
10 0x0000000A
...
100 0x00000064
...
999 0x000003E7
1000 0x000003E8
我在找什么:
Number Sequence
0 000
1 001
...
10 010
11 011
12 012
...
999 999
1000 A00
1001 A01
...
1099 A99
1100 B00
1101 B01
1200 C00
我需要这个才能在 SQL Server 2008 中工作。
您可以使用整数除法和取模来将百位和十位分开。
之后,您可以将商加 64 以获得从 A
.
create function function dbo.fn_NumToThreeLetters(@num integer)
RETURNS nchar(3)
AS
begin
RETURN (SELECT (case
when @num/1000 >0 then
CHAR(( (@num-900)/100) +64)
+ replace(cast( @num %100 as nchar(2)),' ','0')
else cast(@num as nvarchar(3))
end)
)
END
select dbo.fn_NumToThreeLetters(1100)
-------
B00
select dbo.fn_NumToThreeLetters(999)
-------
999
第一个 when
子句确保仅当数字大于 1000 时才应用转换。如果是,减去 900 然后除以 100,所以我们得到一个从 1 开始的数字,表示 1000, 2 表示 1100,等等
将其加64得到一个从A开始的ASCII码并转换回CHAR
的字符。
余数只需要转换为2位nchar,其中空格替换为0
。
这最多只能工作到 3500。问题没有具体说明应该如何处理更大的数字