SQL-varchar列中的小数

时间:2019-07-02 12:44:01

标签: sql sql-server

为什么我指定了99.73时此查询会拉cast(measure_rate as decimal)= 100

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY zip_code ORDER BY cast(measure_rate as decimal) DESC) AS rn
   FROM AmbulatoryMeasures
   where measure_rate != 'n/a'
)
SELECT * 
FROM cte
WHERE rn = 1
and cast(measure_rate as decimal) = 100

measure_rate列的结果-

100
99.73
100
100

measure_rate列的数据类型是varchar(50)。

由于where子句,我不希望结果集中有99.73值。

5 个答案:

答案 0 :(得分:2)

默认的小数位数为0。如果您以精度和小数位数指定小数,则将得到正确的结果:

SELECT CAST('99.73' AS DECIMAL(18,2))

答案 1 :(得分:1)

如果将99.73强制转换为DECIMAL,则得到100,这样就可以得到预期结果,请考虑使用小数部分的精度,例如2位小数

 CAST(measure_rate AS DECIMAL(38, 2))

(38精度只是一个例子,请选择一个更适合您的数据的数字)

答案 2 :(得分:0)

decimal没有刻度或精度,因此使用默认值。这可能意味着缩放比例设置为0,因此由于舍入,'99.73'被强制转换为100

如果以适当的比例和精度将表中列的数据类型从varchar更改为decimal,则不会发生这种情况。这只是选择错误数据类型是一个错误决定的原因之一。

答案 3 :(得分:0)

您需要定义小数位数和小数位数的精度 您可以使用

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY zip_code ORDER BY cast(measure_rate as decimal) DESC) AS rn
   FROM AmbulatoryMeasures
   where measure_rate != 'n/a'
)
SELECT * 
FROM cte
WHERE rn = 1
and cast(measure_rate as decimal(16,2)) = 100

答案 4 :(得分:0)

在转换为DECIMAL时,应指定精度。 考虑以下两个片段。

    --Your situation - no precision 
        DECLARE @test AS TABLE(MYVALUE VARCHAR(50));
        INSERT INTO @test
               SELECT '99.73';
        SELECT myvalue, 
               CAST(myvalue AS DECIMAL)
        FROM @test
        WHERE CAST(myvalue AS DECIMAL) = 100;

--Casting with precision         
        DECLARE @test2 AS TABLE(MYVALUE VARCHAR(50));
        INSERT INTO @test2
               SELECT '99.73';
        SELECT myvalue, 
               CAST(myvalue AS DECIMAL(10,2))
        FROM @test2

结果如下图所示。 enter image description here