【发布时间】:2020-12-03 20:16:58
【问题描述】:
我一直在追一个问题几个小时,这似乎来自我对mySql中的coalesce函数的误解。
运行以下:
SET @a=30;
SET @b=NULL;
SELECT COALESCE(@a, @b) c;
将导致 c 成为 blob,而不是 30。发生了什么,合并运算符不应该只是返回 @a 并停在那里吗?感觉我错过了一些非常基本的东西(这是使用 5.7 Docker 映像)
虽然规格看起来很清楚....?
https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce
编辑 08/14
为了进一步挖掘 nbk 的回答和评论(关于我在这里使用用户定义变量的事实),我的真实案例更接近于这个:
START TRANSACTION;
set @a=NULL, set @b=NULL;
...
SELECT autoIncrementId INTO @a FROM aTable WHERE something;
...
INSERT INTO aTable (SELECT something WHERE @a IS NULL);
SET @b=LAST_INSERT_ID();
...
SELECT COALESCE(@a, @b) c;
COMMIT;
我继续以这种方式使用@a 和@b,进行不同的条件插入和更新。我知道有不同的方法可以进行条件插入,但是这种方法不会弄乱自动增量,我喜欢这种方法。
但与此无关,我总是将@a 或@b 设置为自动递增索引的值。他们的类型不应该被 mySql 知道为 INT 吗?
【问题讨论】:
-
对我来说效果很好。见db-fiddle.com/f/rnoG84NzJYUb1HD8ZcYC6E/0 ...一定是别的东西。
-
这是整个代码,还是更大查询的一部分?
-
@Barmar 这是一个更大的查询的一部分,我在最后调整两个“LAST_INSERT_ID()”结果,以运行一些清理查询。但这实际上归结为我在此处作为示例提供的内容,并且在我的服务器上不起作用(我正在通过 mySql 工作台运行这个虚拟示例,它为我提供了与我的完整应用程序相同类型的行为,正在运行一个nodejs mysql客户端)
-
在某些情况下 MySQL 会自动转换类型,例如
UNION中的子查询会为同一列返回不同的数据类型。 -
nbk 的回答也是如此。我今天学到了一些东西:-)
标签: mysql