簡體   English   中英

IF 語句中的 SQL SELECT 語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM