我们正在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
提供值的正确方法是什么?
答案 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 = ...
然后,我们希望基于条件测试对另一个用户定义的变量进行赋值,我们可以在另一个SELECT
或SET
语句中实现这一点。
例如:
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