非常基本的 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
子句放在UPDATE
statement 的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 else 语句在 javascript 中不起作用
Liquid - if contains 语句在 for 循环中不起作用