存在这样的要求:一列(小数/浮点数)的值范围从整数(例如1)到最多6个小数位(例如1.123456)。我想要获得以下逻辑中解释的值。
value1 | value_new
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
13.123456 | 131234.56 --logic: value1: if there are 6 values after decimal, value_new: multiply value1 by 10000
0.12345 | 123.45 --logic: value1: if there are 5 values after decimal, value_new: multiply value1 by 1000
13.1234 | 1312.34 --logic: value1: if there are 4 values after decimal, value_new: multiply value1 by 100
13.123 | 131.23 --logic: value1: if there are 3 values after decimal, value_new: multiply value1 by 10
13.12 | 13.12
13.1 | 13.1
13 | 13
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
创建表格:
DECLARE @T AS TABLE
(
Value1 float
)
INSERT INTO @T (Value1) VALUES
(13.123456),
(0.12345),
(13.1234),
(13.123),
(13.12),
(13.1),
(13);
答案 0 :(得分:1)
这确实属于表示层,但是,一种选择是通过format()
创建字符串。
请注意:format()的性能不是很高。应该谨慎使用。
示例
Select *
,NewValue = format(value1,'0.##')
From YourTable
value1 NewValue
13.123456 13.12
13.12345 13.12
13.1234 13.12
13.123 13.12
13.12 13.12
13.1 13.1
13 13
答案 1 :(得分:1)
更新
一种到达方法是使用cross apply
计算一个比原始浮点值大1000000的int,然后使用%
确定原始小数点后的位数数字-一个简单的case
表达式:
SELECT Value1,
CASE
WHEN Base % 10000 = 0 THEN Value1
WHEN Base % 1000 = 0 THEN Value1 * 10
WHEN Base % 100 = 0 THEN Value1 * 100
WHEN Base % 10 = 0 THEN Value1 * 1000
ELSE Value1 * 10000
END As NewValue
FROM @T
CROSS APPLY (
SELECT CAST((Value1 * 1000000) AS INT) As Base
) baseValue
结果:
Value1 NewValue
13,123456 131234,56
13,12345 13123,45
13,1234 1312,34
13,123 131,23
13,12 13,12
13,1 13,1
13 13
尽管我同意这是表示层的责任,
另一种选择是乘以100,强制转换为整数,强制返回浮点数,然后再除以100。
首先,创建并填充示例表(请在您将来的问题中为我们保存此步骤):
DECLARE @T AS TABLE
(
Value1 float
)
INSERT INTO @T (Value1) VALUES
(13.123456),
(13.12345),
(13.1234),
(13.123),
(13.12),
(13.1),
(13);
查询:
SELECT Value1, CAST(CAST(Value1 * 100 AS int) AS float) / 100 As NewValue
FROM @T
结果:
Value1 NewValue
13,123456 13,12
13,12345 13,12
13,1234 13,12
13,123 13,12
13,12 13,12
13,1 13,1
13 13