SQL SELECT IF 语句中的语句

SQL SELECT statement within an IF statement

我在 SQL 服务器中有一个触发器,它需要检查更新具有一定数量之间的值的行数并相应地执行某些操作。我当前的代码是这样的:

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 函数应该 return 1 查询将执行 IF 语句中的代码。

但是,发生的情况是它始终执行 IF 语句中的代码,而不管值在 2 到 20 之间的行数。

关于为什么会这样有什么想法吗?如果可能有帮助,我可以 post 更完整的代码。

原因是 Exists 函数正在检查 existing 的子查询的结果 - 是否有任何行。而且,当您 return COUNT 时,它永远不会不存在 - COUNT returns 0 如果数据库中没有行。

尝试将结果计数存储在局部变量中,就像这个问题:

Using IF ELSE statement based on Count to execute different Insert statements

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

您的子查询正在整个 table 中寻找匹配项。它不会将结果仅限于那些与受更新影响的行相关的结果。因此,如果 table 已经有与您的条件匹配的行,则在影响 other 行的任何更新中条件都将为真。

为了仅计算相关行,您应该将 database table 加入 inserted 伪 table 或使用 只是 inserted table(你的问题中没有足够的信息来确定哪个更好)。

我会这样做(单行):

IF ((SELECT COUNT(id) FROM table WHERE ....)>18) BEGIN
...do something

你甚至可以在一行中做 between

IF ((SELECT COUNT(id) FROM table WHERE ....)between 2 and 20) BEGIN
...do something
END