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
我在 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