如何在MySQL中测试IF语句?
如何在MySQL中测试IF语句 我需要知道,当查询进入如何在MySQL中测试IF语句?,mysql,sql,if-statement,Mysql,Sql,If Statement,如何在MySQL中测试IF语句 我需要知道,当查询进入IF语句时,如果它什么也不返回(选择了0行),会发生什么 换句话说,SELECT查询在选择no行时返回什么?它是否返回NULL?如果是,那么这是否会引发错误如果为空,则…?或者在这种情况下,如果不执行,则只执行该的语句 实际上,我有这样一个代码: IF ( SELECT banned FROM users WHERE id=new.user_id ) THEN // do stuff 注意:禁止列包含0或1 我想知道的是,当查询不返回任
IF
语句时,如果它什么也不返回(选择了0行),会发生什么
换句话说,SELECT
查询在选择no行时返回什么?它是否返回NULL
?如果是,那么这是否会引发错误<代码>如果为空,则…?或者在这种情况下,如果不执行,则只执行该的语句
实际上,我有这样一个代码:
IF ( SELECT banned FROM users WHERE id=new.user_id ) THEN
// do stuff
注意:禁止
列包含0
或1
我想知道的是,当查询不返回任何行时,我的代码是否安全?我的意思是,它会抛出一个错误还是什么都不会发生(如果
语句没有执行,就只会发生)
注意到我想自己测试它,但我不知道如何在MySQL中测试IF
语句。例如,我想通过以下代码对其进行测试:
BEGIN
IF ( SELECT banned FROM users WHERE id=new.user_id ) THEN
SELECT 'test';
ENDIF;
END
但上面的代码甚至没有运行。这就是我问这个问题的原因。如果可以在MySQL存储程序(过程、函数或触发器)的上下文中测试IF
语句,MySQL不支持匿名块
要测试IF
语句,可以创建一个过程
DELIMITER $$
CREATE PROCEDURE foo
BEGIN
IF ( some_condition ) THEN
SELECT 'evaluation of some_condition returned TRUE' AS msg;
ELSE
SELECT 'evaluation of some_condition did NOT return TRUE' AS msg;
END IF;
END$$
DELIMITER ;
CALL foo;
可以在MySQL存储程序(过程、函数或触发器)的上下文中测试IF
语句。MySQL不支持匿名块
要测试IF
语句,可以创建一个过程
DELIMITER $$
CREATE PROCEDURE foo
BEGIN
IF ( some_condition ) THEN
SELECT 'evaluation of some_condition returned TRUE' AS msg;
ELSE
SELECT 'evaluation of some_condition did NOT return TRUE' AS msg;
END IF;
END$$
DELIMITER ;
CALL foo;
我需要知道,当一个查询进入IF语句时,它什么也不返回(选择了0行),会发生什么
实际上,这里要问的是一个标量子查询
标量子查询只返回一列和一行或零行。返回NULL
和匹配的零行是等效的,两者都不会抛出错误。在这两种情况下,子查询返回的“值”都是NULL
但是,如果您试图编写一个返回多行的标量子查询(例如,当您忘记子查询中的WHERE
时),您将抛出一个错误。但是,零行是完全有效的
IF
测试真实性,以及为真的任何内容
…这在技术上意味着这两个都不为假的任何表达式
和都不为空
——满足IF
。如果返回值为假
(0)或NULL
则将遵循ELSE
分支(如果存在)
我突出显示了上面的关键字短语,如不是FALSE
,以强调这是SQL中的逻辑运算符
请尝试类似以下查询:SELECT 0为FALSE
(返回1,因为它为FALSE)或SELECT NULL不为TRUE
(返回1,因为它不是TRUE)或SELECT NULL不为FALSE
(也返回1,因为它不是)SELECT NULL为FALSE
(返回0,因为它不是),以了解我的意思
我需要知道,当一个查询进入IF语句时,它什么也不返回(选择了0行),会发生什么
实际上,这里要问的是一个标量子查询
标量子查询只返回一列和一行或零行。返回NULL
和匹配的零行是等效的,两者都不会引发错误。在这两种情况下,子查询返回的“值”都是NULL
但是,如果您试图编写一个返回多行的标量子查询(例如,当您忘记子查询中的WHERE
时),您将抛出一个错误。但是,零行是完全有效的
IF
测试真实性,以及为真的任何内容
…这在技术上意味着这两个都不为假的任何表达式
和都不为空
——满足IF
。如果返回值为假
(0)或NULL
则将遵循ELSE
分支(如果存在)
我突出显示了上面的关键字短语,如不是FALSE
,以强调这是SQL中的逻辑运算符
请尝试以下查询:SELECT 0为FALSE
(返回1,因为它为FALSE)或SELECT NULL不为TRUE
(返回1,因为它不是TRUE)或SELECT NULL不为FALSE
(也返回1,因为它不是)SELECT NULL为FALSE
(返回0,因为它不是FALSE)看看我的意思。SQL中没有IF语句。你可以编写存储过程,但这些存储过程是MySQL特有的,不会在任何其他关系数据库中运行。@duffymo好的,谢谢你。你所说的解释了我的代码不起作用的原因。你能告诉我当子查询不返回任何内容,并且它进入IF语句?它会抛出错误还是只执行ELSE
块?SQL中没有IF语句。您可以编写存储过程,但这些存储过程是特定于MySQL的,不会在任何其他关系数据库中运行。@duffymo好的,谢谢您。您所说的解释了我的代码不工作的原因。您能告诉我当n子查询不返回任何内容,并且进入IF
语句?它会抛出错误还是只执行ELSE
块?谢谢..upvote..但我的主要问题是,当子查询不返回任何内容而进入IF
语句时会发生什么?它会抛出错误还是只执行ELSE
块?我的误解是安定。我以为你在问如何测试IF语句。好吧,没关系。我自己会测试它。还有一件事,一个过程是临时的或强制性的?我的意思是当我写CREATE procedure foo
时,一个过程将永远被创建?我可以随时使用foo
吗?删除procedure foo;
是的,procedurefoo
将被保留,直到它被删除。如果只是临时测试,请删除该过程,但保留scri