2014-01-28 91 views
2

場我創建了一個表,有一個命名爲nvarchar領域的「注意」,人們可以進入任何他們想要的(數字或文本),以幫助他們的搜索。SQL查詢VARCHAR與數字搜索

例如

Table "Customer" 
ID Name Notes 
1 AAA 1234 
2 BBB 1235 
3 CCC 1236 
4 DDD ABCD 

從這個數據,我想只有1200之間注意SQL查詢寫入但是1300也不會允許我這樣做,因爲這領域也包含文本值。

我想這

SELECT * 
FROM Customer 
WHERE ISNUMERIC(Notes) = 1 AND Notes > 1200 AND Notes < 1300 

錯誤:轉換nvarchar的值時,轉換失敗爲int

,然後我想這一點,我雖然會工作,但同樣的錯誤出現

SELECT * 
FROM 
(SELECT * 
    FROM Customers 
    WHERE ISNUMERIC(Notes) = 1 
) A 
WHERE A.Notes > 1200 AND A.Notes < 1300 

有人能幫忙嗎?非常感謝

+0

代表VARCHAR的數值是非常糟糕的做法。仔細想想你爲什麼需要這樣做,難道你不能只是多餘地使用另一列。 – zinking

回答

1

試試這個:

SELECT * 
FROM Customer 
WHERE (case when ISNUMERIC(Notes) = 1 then cast(Notes as float) end) > 1200 AND 
     (case when ISNUMERIC(Notes) = 1 then cast(Notes as float) end) < 1300 

這工作,因爲case保證評價在這種情況下的順序。你也可以使用子查詢寫:

select * 
from (select c.*, 
      (case when ISNUMERIC(Notes) = 1 then cast(Notes as float) end) as NotesNum 
     from Customer c 
    ) c 
where NotesNum > 1200 and NotesNum < 1300; 

或者,這可能會接近你想要什麼:

SELECT * 
FROM Customer 
WHERE ISNUMERIC(Notes) = 1 AND 
     Notes > '1200' AND Notes < '1300' and len(notes) = 4 and notes not like '%.%'