2016-09-22 44 views
1

我正在處理數據庫,其中一些明亮的火花決定在char字段中存儲數字和字母(沒有很好的理由)是一個好主意。檢查char字段中的數字

現在我需要選擇數字低於某個值的位置,但由於某些記錄中存在字母,很明顯會出現錯誤。

我曾嘗試以下

select column1 
from table1 
where ISNUMERIC(column1)=1 
AND column1<=16 

但我得到以下錯誤轉換VARCHAR值 '5.00' 時的數據 類型爲int

轉換失敗。

現在看起來像一個數字,所以爲什麼它不能轉換它?

回答

0

CAST列,如果它是數字

select column1 
from table1 
where ISNUMERIC(column1)=1 
AND CAST(column1 AS DECIMAL(18,2)) <= 16.0 
+0

這給了我同樣的錯誤作爲 – coolblue2000

+0

優秀前!謝謝你的出色工作。 – coolblue2000

1

這是SQL Server中的已知問題。在SQL Server 2012+正確的解決方案是使用try_convert()

select column1 
from table1 
where try_convert(int, column1) <= 16; 

與您的查詢的問題是,SQL服務器(就像所有其他數據庫)不保證where子句中表達式的計算順序。請注意,您無法使用子查詢或CTE修復您的版本,因爲SQL Server在編譯和執行查詢時保留重新排列操作的權利。

在早期版本中,你基本上可以使用case同樣的事情:

select colum1 
from table1 
where (case when isnumeric(column1) = 0 
      then 999 
      else convert(int, column1) 
     end) <= 16 

注:這兩個假定字符串值是一個整數。如果它可能是十進制數字,則使用適當的類型進行轉換。

+0

這個case語句給了我一個錯誤的語法時才「附近有語法錯誤結束,預計AND,OR或THEN」 – coolblue2000