2016-10-28 84 views
1

我有一列,我想轉換爲十進制,所以我可以用它來比較我的where條款。我想確保列中的所有值都大於或等於1.3。我成功地轉換列在select聲明,但試圖做的where子句我得到以下錯誤在同一個轉換時:我可以使用case語句將varchar轉換爲decimal並在我的where子句中使用該語句嗎?

Arithmetic overflow error converting varchar to data type numeric.

我使用SQL Server 2008的

SELECT ID, 
    CASE 
     WHEN ISNUMERIC(USER_3) = 1 
      THEN Convert(varchar(50), CONVERT(decimal(14,2), USER_3)) 
     END AS KG_M 
FROM PART 
WHERE USER_3 IS NOT NULL 
     AND CASE 
      WHEN ISNUMERIC(USER_3) = 1 
       THEN Convert(varchar(50), CONVERT(decimal(14,2), USER_3)) 
      END >= 1.3 
+0

你應該使用'> ='1.3'',因爲你正在轉換爲'varchar' – Lamak

+0

哦,哇這麼小的監督......謝謝。對於這個虛假的問題抱歉,我知道它應該一直工作。我甚至沒有想到語法錯誤。 – Azuraith

+1

您可以顯示'USER_3'列中的數據嗎? 'ISNUMERIC'不可靠 –

回答

0

問題是一個語法錯誤,where子句中的情況一直是成功的。

「你應該使用> =‘1.3’,因爲你正在轉換爲varchar」信用評價

1

您需要選擇轉換一種方式來@Lamak。我會使用本地類型進行比較,十進制。

SELECT * FROM 
(
    SELECT ID, KG_M=CAST(USER_3 AS decimal(14,2)) 
    FROM PART 
    WHERE 
     ISNUMERIC(USER_3) = 1 
)AS X 
WHERE 
    X.KG_M >= 1.3 

允許字符串不是在outoput數字

SELECT * FROM 
(
    SELECT 
     ID, 
     USER_3_AsDecimal=CASE WHEN ISNUMERIC(USER_3) THEN CAST(USER_3 AS decimal(14,2)) ELSE NULL END, 
     USER_3 
    FROM PART 
    WHERE 
     NOT USER_3 IS NULL 
)AS X 
WHERE 
    X.USER_3_AsDecimal IS NULL 
    OR 
    X.USER_3_AsDecimal >= 1.3 
+0

因此可以說user_ID ='TEST'它通過空檢查失敗的數字檢查;並且查詢的輸出將有一個名爲KG_M的列,該列有兩個數據類型。我認爲SQL服務器會抱怨,不是嗎?沒有想到結果集可能有一列的兩個數據類型。也許它會隱式地將十進制轉換回varchar;但我不這麼認爲。 – xQbert

+0

如果您的ISNUMERIC = 1被用於在哪裏,那麼您可以確保所有字符串值都是數字,並可以安全地轉換爲小數。 –

+0

應該/會這樣做。但是,它可能會(基於錯誤)刪除由於user_3字段中的垃圾/意外數據而導致的一些數據。 – xQbert

2

當然,爲什麼不?下面是一個自包含的例子:

select a.ID 
    , b.KG_M 
from (values 
    (1, N'12345678') 
    , (2, N'ABCDEFGH') 
) as a (ID, USER_3) 
cross apply (values(
    case IsNumeric(a.USER_3) 
     when 1 then Convert(varchar(50), Convert(decimal(14, 2), a.USER_3)) 
     else a.USER_3 
    end 
)) as b (KG_M) 
where b.KG_M >= '1.3'; 

我們簡單地使用APPLY操作以後包含我們的重用計算。

相關問題