我正在尝试在SQL Server中将值拆分为单位,千位,百万位和十亿位。值可以是负数,也可以是正数,并且没有为该值设置字符数/数字。我到了这一点:
这是我的代码:
UPDATE table
SET Units = RIGHT(CONVERT(VARCHAR(50),[Value]), 3)
UPDATE table
SET Thousands = Right(CONVERT(VARCHAR(50),[Value]), 6)
UPDATE table
SET Thousands = SUBSTRING(CONVERT(VARCHAR(50),Thousands), 1, 3)
但是在这里我遇到了一个问题,好像我有一个数字“ 1 019 242”,对于它可以工作的单位-> 242,但是对于成千上万的人,我首先想从右边得到6位数字:019242,然后首先是子字符串3位数字,但是0消失了,所以我得到192 ...而不是19 ...
我也不知道该怎么做,因为数字的大小可能会有所不同,所以它可能是'19 105'或'37 594 820 583'...
顺便说一句,这只是我想出的方式,但是也许有一些更容易做的事情!
谢谢您的帮助!
现在,我正在尝试将结果保存到“数千”列中。不确定如何执行,我正在查找。
再次感谢您的帮助!
答案 0 :(得分:4)
整数数学和mod的混合应该可以得到想要的东西
SELECT A.Value,
ABS(A.Value) / 1000000000 AS Billions,
ABS(A.Value) % 1000000000 / 1000000 AS Millions,
ABS(A.Value) % 1000000 / 1000 AS Thousands,
ABS(A.Value) % 1000 AS Units,
CASE WHEN A.Value < 0 THEN -1 ELSE 1 END AS New_Col
FROM (
VALUES (CAST(3070192242 AS BIGINT)),(-370192242)
) AS A(Value);
编辑:
更新声明:
UPDATE A
SET Billions = ABS(A.Value) / 1000000000,
Millions = ABS(A.Value) % 1000000000 / 1000000,
Thousands = ABS(A.Value) % 1000000 / 1000,
Units = ABS(A.Value) % 1000,
New_Col = CASE WHEN A.Value < 0 THEN -1 ELSE 1 END AS New_Col
FROM dbo.YourTable AS A;
答案 1 :(得分:2)
请尝试以下操作:
update [table] set
[units] = abs([value] % 1000)
,[thousands] = abs([value] % 1000000 / 1000)
,[millions] = abs([value] % 1000000000 / 1000000)
,[billions] = abs([value] % 1000000000000 / 1000000000)
,[new_col] = sign([value])
而且,如果您遇到日志文件增长的问题,请尝试使用循环方法,它使用的日志空间更少:
while exists (select null from [table] where [units] is null)
begin
update top(1) percent [table] set
[units] = abs([value] % 1000)
,[thousands] = abs([value] % 1000000 / 1000)
,[millions] = abs([value] % 1000000000 / 1000000)
,[billions] = abs([value] % 1000000000000 / 1000000000)
,[sign] = sign([value])
where [units] is null
end;
答案 2 :(得分:1)
另一个选择是使用计算字段。这些字段在数据库中使用没有空间,因此文件大小应该不成问题。并且您不需要设置它们或更新它们。
create table BigVal ( [Value] int,
Billions as abs([Value] / 1000000000 ),
Millions as abs([Value] % 1000000000 / 1000000),
Thousands as abs([Value] % 1000000 / 1000),
Units as abs([Value] % 1000),
[Sign] as case when Value < 0 then -1 else 1 end )
insert into BigVal ( [Value] ) values
( 234 ),
( 123456 ),
( 123456789 ),
( 1234567890 ),
( -23 ),
( -1234567890 ),
( 2147483647 ),
( -2147483648 )
select * from BigVal
结果是:
Value Billions Millions Thousands Units Sign
----------- ----------- ----------- ----------- ----------- -----------
234 0 0 0 234 1
123456 0 0 123 456 1
123456789 0 123 456 789 1
1234567890 1 234 567 890 1
-23 0 0 0 23 -1
-1234567890 1 234 567 890 -1
2147483647 2 147 483 647 1
-2147483648 2 147 483 648 -1
答案 3 :(得分:0)
转换为字符串后,请在其前面(左侧)留有空格。
一千个总是LEFT ( RIGHT ( VALUE , 6) , 3)
thousands = left(right(space(10) + convert(varchar(100), [value]), 6), 3)
答案 4 :(得分:0)
谢谢大家!
因此,上面注释中提到的查询对我有用,如果数据库大小不足,请增加它(日志文件),然后它将起作用。