非常基本的 IF EXISTS 语句不起作用

Posted

技术标签:

【中文标题】非常基本的 IF EXISTS 语句不起作用【英文标题】:Very basic IF EXISTS statement not working 【发布时间】:2021-02-26 09:21:37 【问题描述】:

我真的不明白为什么我的说法:

IF EXISTS (SELECT * FROM people WHERE ID = 168)
THEN SELECT * FROM people
END IF;

返回此错误:

Unknown statement type. (near "IF EXISTS" at position 0)

我正在使用 MariaDB 10.3。有什么想法吗?

附加信息

这当然是一个简化的例子。具体来说,我想做的是:

IF EXISTS (SELECT * FROM people WHERE ID = 168)
THEN UPDATE people SET calculated_value = complex_queries_and_calculations
WHERE ID = 168

..,因此如果该记录包含给定数据,则更新给定记录的字段,否则不执行任何操作。 要生成将用于更新的数据,我需要查询其他表的值并进行一些计算。如果实际上没有什么要更新的,我想避免这些查询+计算。在这种情况下,什么也不做。 因此,我猜想将例如EXIST 子句放在UPDATEstatement 的WHERE 子句中会导致许多查询和计算徒劳无功。

【问题讨论】:

【参考方案1】:

mysql 和 MariaDB 仅允许在编程块(存储函数、过程和触发器)中使用 IF 语句。

相反,只需使用:

select p.*
from people p
where exists (select 1 from people p2 where p2.id = 168);

如果id 168 在表中,则返回所有人。

【讨论】:

mariadb 的文档实际上并没有提到这些基础知识,这真是令人失望……(请参阅mariadb.com/kb/en/if)。谢谢,但这并不能解决我的问题。如果数据库中存在指定 ID 的给定记录(否则什么都不做),我只想更新一个表(我简化了我的示例)。换句话说,我想使用 IF EXISTS 来缩短我的语句,并且只有在找到相关记录时才继续更新语句。对于那种情况,这个答案不是正确的解决方案,对吗?您可能知道如何使用 IF EXISTS 或 CASE WHEN 进行短路? @DevelJoe 。 . .这回答了您在此处提出的问题。如果您有不同的问题,则应将其作为 问题提出,而不是通过演变此问题来提出。也就是说,update 可以具有相同的 where 子句。 它确实回答了我的问题的语法问题,是的,谢谢,但不是合乎逻辑的目的;因为我的代码试图缩短 select 语句的执行(在语句之前设置条件),而您的答案用简单的 WHERE 子句替换了短路语句,从而改变了整个游戏的逻辑。 .(或者我错了,WHERE 子句执行短路语句)?我的意思是不要误会我的意思,对你没有任何批评,而是要明确我的意图,以及为什么我使用 IF EXISTS 而不是 WHERE..

以上是关于非常基本的 IF EXISTS 语句不起作用的主要内容,如果未能解决你的问题,请参考以下文章

IF EXISTS SQL 语句不起作用

基本的 If else 语句在 javascript 中不起作用

Liquid - if contains 语句在 for 循环中不起作用

IF 语句不起作用

pandas DataFrame.to_sql() 函数 if_exists 参数不起作用

else 在 if 语句中不起作用