IF语句中的SQL SELECT语句

时间:2015-03-12 23:44:54

标签: sql sql-server select if-statement count

我在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之间的行数。

关于为什么会出现这种情况的任何想法?如果可能有帮助,我可以发布更完整的代码。

3 个答案:

答案 0 :(得分:1)

原因是Exists函数正在检查existing的子查询结果 - 是否存在任何行。并且,当您返回COUNT时,如果数据库中没有显示任何行,那么它永远不会存在 - COUNT会返回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

答案 1 :(得分:0)

您的子查询正在整个表中查找匹配项。它不会仅将结果限制为与受更新影响的行相关的结果。因此,如果表中已有符合条件的行,则在影响其他行的任何更新中,条件都将为真。

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

答案 2 :(得分:0)

我会这样(单行):

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