[英]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.