首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >varchar列中的SQL - Decimals

varchar列中的SQL - Decimals
EN

Stack Overflow用户
提问于 2019-07-02 20:44:01
回答 5查看 138关注 0票数 0

当我指定了cast(measure_rate as decimal)= 100时,为什么这个查询拉取99.73

代码语言:javascript
复制
;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列的结果是-

代码语言:javascript
复制
100
99.73
100
100

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-07-02 20:56:41

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

代码语言:javascript
复制
    --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

结果如下图所示。

票数 0
EN

Stack Overflow用户

发布于 2019-07-02 20:50:38

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-07-02 20:50:16

如果您将99.73转换为DECIMAL,则得到100,因此结果是预期的,为了考虑小数部分,对于2个小数的精度如下所示

代码语言:javascript
复制
 CAST(measure_rate AS DECIMAL(38, 2))

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56852793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档