簡體   English   中英

SQL-varchar列中的小數

[英]SQL - Decimals in varchar columns

當我指定cast(measure_rate as decimal)= 100時,為什么此查詢會拉99.73

;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值。

默認的小數位數為0 如果您以精度和小數位數指定小數,則會得到正確的結果:

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

如果將99.73強制轉換為DECIMAL,則得到100,因此可以得到預期結果,請考慮將小數部分作為2小數精度進行如下操作

 CAST(measure_rate AS DECIMAL(38, 2))

(38精度只是一個示例,請選擇一個更適合您數據的數字)

您的decimal或精度,因此使用默認值。 這可能意味着小數'99.73'設置為0,因此由於舍入, '99.73'100

如果將表中列的數據類型從varchar更改為具有適當比例和精度的decimal ,則不會發生這種情況。 這只是選擇錯誤數據類型是一個錯誤決定的原因之一。

您需要定義十進制數字的精度和可以使用的十進制數的位數

;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

在轉換為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

結果如下圖所示。 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM