2014-04-21 72 views
0

在我的query我需要得到的百分比是少於50%的記錄。t-sql:什麼是最好的方法來比較小數

存儲百分比值的字段定義爲char(3)。 例如,我看到定義爲」 0.35'

在我的查詢我使用的條件where mypercentagevalue < '.50'一些數據,但我注意到,該領域也有價值觀,如‘85’,‘95’,它不會工作, '90後' 和等

會我可以用比較對所有案件

謝謝

+0

您需要讓您的數據始終如一FIRST ... – JNK

+0

此數據已經存在,不幸的是我現在必須處理。 –

+0

處理它的最好方法是修復它。選擇一種格式並使其一致。如果您無法使用更正的格式創建新表格或修復當前數據以使其保持一致,那麼您的問題就更大了。 – JNK

回答

0

尤金 - 由於此字段定義爲char(3),請執行下列操作:

首先 - 確保你有一個號碼我n帶有case語句和IsNumeric函數的字段。然後將其轉換爲數字。

select * from [dbo].[YourTable] 
where cast(case isnumeric([YourField]) when 0 then 0 else [YourField] end as numeric(9,2)) < .5 

整個數字(85,90等)將顯示在結果中,直到您正確地獲取數據格式爲止。

+0

是的,因爲'£'很容易轉換爲數字。 'ISNUMERIC'是一個*從根本上*無用的功能,因爲它回答了一個沒人想問的問題。它不會告訴你一個字符串是否可以轉換爲*特定的*數據類型。 –

+0

數據如'.35'怎麼樣? –

+0

@ Damien_The_Unbeliever在嘗試運行示例時出現以下錯誤:將轉換varchar值「.35」轉換爲數據類型爲int的轉換失敗。 –

0

我同意@ Eugene.it和@JNK,但如果由於某種原因(我想不出一個好的),你不能修復數據,那麼你可以使用下面的東西。

WHERE .5 > CASE WHEN CAST(mypercentagevalue as decimal (6,2)) >= 1 THEN CAST(mypercentagevalue as decimal (6,2))/100 ELSE CAST(mypercentagevalue as decimal (6,2)) END 

雖然我會做下面的事情。

UPDATE #temp 
SET mypercentagevalue = CASE WHEN CAST(mypercentagevalue as decimal (6,2)) >= 1 THEN 
            CAST(mypercentagevalue as decimal (6,2))/100 
            ELSE CAST(mypercentagevalue as decimal (6,2)) END 
+0

當進行第一次查詢時,我得到'將數據類型varchar轉換爲數字' –

+0

這意味着您的數據不是數字。請參閱@ bsivel的答案來檢查。這意味着你的數據比在那裏擁有90個更糟糕。您確實需要修復數據,因爲您的查詢永遠不會返回該字段中具有錯誤值的完整數據。嘗試SELECT * FROM? WHERE ISNUMERIC(mypercentagevalue)= 0 – SteveB

+0

同樣,檢查'ISNUMERIC'的返回值不是一個保證,因爲它不能回答你認爲它的問題。 'ISNUMERIC('1d1')'返回'1',但你不能將該字符串轉換爲'decimal(6,2)' –

相關問題