2011-04-01 56 views
1

我已經看到類似的問題在本網站的其他地方問過,但更多的是在優化環境中。指定(T)SQL執行順序

我遇到了在WHERE子句中執行條件的順序問題。我有一個存儲代碼的字段,其中大部分都是數字,但其中一些包含非數字字符。我需要對數字代碼進行一些操作,如果嘗試使用非數字字符串,將導致錯誤。我試圖做類似

WHERE isnumeric(code) = 1 
AND CAST(code AS integer) % 2 = 1 

有沒有什麼辦法,以確保該ISNUMERIC()執行第一?如果它不,我得到一個錯誤...

在此先感謝!

+0

您幾乎可以肯定需要在這裏使用'CASE'表達式,因爲SQL不允許您定義評估順序。 – Gabe 2011-04-01 20:50:14

+0

這裏的問題是SQL標準缺少[short-circuit evaluation](http://en.wikipedia.org/wiki/Short-circuit_evaluation)。事實上這很好,但這只是我的看法。 – rsenna 2011-04-01 20:54:54

回答

5

評價是保證的唯一場所秩序CASE

WHERE 
    CASE WHEN isnumeric(code) = 1 
      THEN CAST(code AS integer) % 2 
END = 1 

也只是因爲它通過isnumeric測試並不能保證它會成功cast爲整數。

SELECT ISNUMERIC('$') /*Returns 1*/ 

SELECT CAST('$' AS INTEGER) /*Fails*/ 

根據您的需要,您可能會發現these alternatives更可取。

0

爲什麼不使用CASE語句這樣說:

WHERE 
CASE WHEN isnumeric(code) = 1 
THEN CAST(code AS int) % 2 = 1 
ELSE /* What ever else if not numeric */ END 
0

你能做到這一點的select子句中case聲明,然後由值外select

select * from ( 
    select 
    case when isNum = 1 then CAST(code AS integer) % 2 else 0 end as castVal 
    from (
     select 
     Case when isnumeric(code) = 1 then 1 else 0 end as isNum 
     from table) t 
) t2 
where castval = 1 
1
限制

爲什麼不簡單地使用LIKE?:

Where Code Not Like '%[^0-9]%' 

順便說一句,無論是使用我的解決方案或使用IsNumeric,有一些邊緣情況下,可能導致人們使用UDF,如1,234,567其中IsNumeric將返回1但演員將拋出一個異常。