[英]SQL SELECT statement within an IF statement
我在 SQL Server 中有一個觸發器,它需要檢查更新的行數,其值介於一定數量之間,並相應地執行某些操作。 我目前的代碼是這樣的:
IF EXISTS(SELECT COUNT(id) as NumberOfRows
FROM database
WHERE id = 3 AND value <= 20 and value > 2
GROUP BY id
HAVING COUNT(id) > 18)
-- if true, do something
據我所知,select 語句應該找到值在 2 到 20 之間的行數,如果行數超過 18, EXISTS
函數應該返回 1,查詢將執行 IF 語句中的代碼。
但是,發生的情況是它始終執行 IF 語句中的代碼,而不管具有 2 到 20 之間值的行數。
關於為什么會這樣的任何想法? 如果有幫助,我可以發布更完整的代碼。
原因是Exists
函數正在檢查existing
子查詢的結果 - 是否有任何行。 而且,當您返回COUNT
,它永遠不會不存在 - 如果數據庫中沒有行, COUNT
返回0
。
嘗試將結果計數存儲在局部變量中,就像在這個問題中一樣:
使用基於Count的IF ELSE語句執行不同的Insert語句
DECLARE @retVal int SELECT @retVal = COUNT(*) FROM TABLE WHERE COLUMN = 'Some Value' IF (@retVal > 0) BEGIN --INSERT SOMETHING END ELSE BEGIN --INSERT SOMETHING ELSE END
您的子查詢正在整個表中尋找匹配項。 它不會將結果僅限於與受更新影響的行相關的結果。 因此,如果表中已有與您的條件匹配的行,則在影響其他行的任何更新上,該條件將為真。
為了僅計算相關行,您應該將database
表連接到inserted
偽表或僅使用inserted
表(您的問題中沒有足夠的信息來確定哪個更好)。
我會這樣做(單行):
IF ((SELECT COUNT(id) FROM table WHERE ....)>18) BEGIN
...do something
您甚至可以在一行中進行
IF ((SELECT COUNT(id) FROM table WHERE ....)between 2 and 20) BEGIN
...do something
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.