mysql测试IF变量为IS NULL(或为空)

时间:2019-06-26 15:56:26

标签: mysql mariadb

我们正在mysql / mariadb中选择一行并将所选的列存储在变量中。之后,使用IF,我们要测试一个变量,看看它是否已设置或为空,如果是,则为它分配一个值并继续。

在非表达式上使用IS NULL似乎无效。

select id,history,active,jsonorder
INTO @id,@history,@active,@jsonorder
from myTable where uid = myUid
delimiter |
IF @jsonorder IS NULL THEN
  @myNewVal="zzz";
ELSE
  @myNewVal="yyy";
END IF|
insert into otherTable (colA) VALUES (@myNewVar);

测试select是否已向变量@jsonorder提供值的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

我们可以在SELECT列表中使用一个表达式:

SELECT t.id
     , t.history
     , t.active
     , IFNULL(t.order,1) AS `order`
  INTO @id
     , @history
     , @active
     , @order
  FROM `myTable` t
 WHERE t.uid = ...

请注意,DELIMITER不是SQL语句;它是mysql命令行客户端(和其他一些客户端)识别的命令。

MySQL参考手册中的此处记录:https://dev.mysql.com/doc/refman/8.0/en/mysql-commands.html


目前尚不清楚该脚本在什么上下文中运行;是MySQL存储程序的这一部分,或称为应用程序代码。我们实际上正在努力实现什么?


我们可以在SELECT列表中使用其他几个表达式,例如

CASE WHEN t.order IS NULL THEN 1 ELSE t.order END` 

IF(t.order IS NULL,1,t.order)


关注

如果我们不想修改原始的SQL语句;如果执行此操作:

SELECT t.id
     , t.history
     , t.active
     , t.jsonorder
  INTO @id
     , @history
     , @active
     , @jsonorder
  FROM `myTable` t
 WHERE t.uid = ...

然后,我们希望基于条件测试对另一个用户定义的变量进行赋值,我们可以在另一个SELECTSET语句中实现这一点。

例如:

SELECT @myNewVal := IF(@jsonorder IS NULL,'zzz','yyy') ;
                      ELSE 'yyy'

-或-

SELECT CASE
         WHEN @jsonorder IS NULL 
         THEN 'zzz'
         ELSE 'yyy'
       END
  INTO @myNewVal

-或-

SET @myNewVal := IF(@jsonorder IS NULL,'zzz','yyy')

答案 1 :(得分:1)

IF 声明只能在存储例程中使用。 IF 功能实际上可以在可以放置表达式的任何地方使用:

select id,history,active,jsonorder
    INTO @id,@history,@active,@jsonorder
    from myTable
    where uid = myUid;
insert into otherTable (colA)
    VALUES (IF(@jsonorder IS NULL, "zzz", "yyy"));

myUid来自哪里?

otherTable仅一栏宽吗?还是所有其他列都具有默认值?

(我担心您对这个问题的处理过高了。)

答案 2 :(得分:0)

这解决了order为null的情况,但不适用于表中不存在myUid的情况

SELECT id,history,active, COALESCE(order,1)
INTO @id,@history,@active,@order
FROM myTable 
WHERE uid = myUid