2012-11-16 17 views
10

這可能很簡單,但我不是SQL專家,所以我迷路了。據我所知,SQL需要查詢並按照一定的順序執行它,我相信這是爲什麼這個查詢不起作用:檢查字段是否爲數字,然後僅對一個語句中的字段執行比較?

select * from purchaseorders 
where IsNumeric(purchase_order_number) = 1 
and cast(purchase_order_number as int) >= 7 

科技部purchar_order_number字段是數字,但我們最近推出的字母數字的。我試圖得到的數據是看'7'是否大於最高數字purchase_order_number。

數字()函數過濾掉細小的字母數字字段,但這樣做的後續投比較拋出這個錯誤:

Conversion failed when converting the nvarchar value '124-4356AB' to data type int. 

我不要求什麼錯誤意味着,這是顯而易見的。我詢問是否有辦法在單個查詢中完成我想要的操作,最好是由於ORM約束而在where子句中完成。

+1

因爲這只是一個數字,你可以只說'和PURCHASE_ORDER_NUMBER>「7'' –

+0

你可以爲'purchaseorders'表包括索引架構?我正在嘗試構建一個repro - 我目前可以通過ShyJ的例子獲得錯誤信息,但不能和您的例子一樣。 –

回答

22

這是否對你的工作?

select * from purchaseorders 
where (case when IsNumeric(purchase_order_number) = 1 
     then cast(purchase_order_number as int) 
     else 0 end) >= 7 
+0

謝謝!很好的工作 – ledgeJumper

1

你可以做一個選擇與子查詢

select * from (
select * from purchaseorders 
where IsNumeric(purchase_order_number) = 1) as correct_orders 
where cast(purchase_order_number as int) >= 7 
+0

@AaronBertrand你說得對。抱歉。 – ShyJ

+0

但是優化器仍然可以重新編寫該查詢並在過濾器之前處理演員表。 –

+0

@AaronBertrand它真的可以做到這一點?因爲這會改變查詢的語義。 – ShyJ

0

試試這個:

select * from purchaseorders 
where try_cast(purchase_order_number as int) >= 7 
+0

雖然這段代碼可以解決這個問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高您的質量帖子。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – bahrep