我正在 SQL Server Management Studio (v18.10) 中開發一個專案,基本上我需要的是對我們的一些規則進行例外處理。我們有一些函式可以根據它是偶數還是奇數進行一些其他計算,但是因為有“例外”,我也需要能夠處理這些。這些數字存盤為文本,因為在它們少于 3 個字符的情況下,它們需要有前導 0。下面的代碼片段幾乎正是我現在所擁有的。
CASE
WHEN
(Num % 2 = 0
OR Num = '001'
AND NOT (Num = '124'))
THEN /*Do something*/
WHEN
(Num % 2 = 1
OR Num = '002'
AND NOT (Num = '123'))
THEN /*Do a different thing*/
ELSE /*Do something else*/
END
到目前為止,我在“偶數”部分的例外情況有效,只是奇怪的例外情況似乎不起作用。(即 Num = '001' 被視為偶數,但 Num = '124' 也仍被視為偶數。)似乎它仍在將其讀取為偶數,然后不會進入下一個 WHEN 陳述句。我也嘗試過使用其他一些變體但沒有成功。
AND Number <> '124'
AND Number <> 124
AND NOT Number = 124
我無法弄清楚為什么這些不起作用!我需要把例外放在第一位嗎?AND 例外需要在 OR 例外之前出現嗎?我總共有大約 10 個例外要處理,并且“奇數”部分中的所有例外都不起作用。
uj5u.com熱心網友回復:
所以你真的應該看看 SQL Server 的運算子優先級圖表。 https://docs.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-ver15
AND 的排名高于 OR,因此首先評估 AND。對于相同等級的運算子,它們總是從左到右。
讓我們看看現在的情況。
WHEN
(Num % 2 = 0
OR Num = '001'
AND NOT (Num = '124'))
THEN /*Do something*/
這真的意味著
(Num % 2 = 0
OR (Num = '001'
AND NOT (Num = '124')))
因此,如果 Num 為 124,則第一部分 Num%2 為真并讓它被處理。
您在這里真正需要的
(Num % 2 = 0
OR Num = '001')
AND NOT (Num = '124')
TLDR:顯式放置括號以避免 SQL 解釋錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/461149.html
