【问题标题】:Strange coalesce result when second value is null当第二个值为空时,奇怪的合并结果
【发布时间】: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


【解决方案1】:

其实mysql是一个二进制字符串值(BINARY/VARBINARY类型),这就是为什么它显示BLOB,你必须像CAST一样

SET @a=30;
SET @b=NULL;
SELECT  CAST(COALESCE(@a, @b) AS CHAR(10000) CHARACTER SET utf8)

结果:

CAST(COALESCE(@a, @b) AS CHAR(10000) CHARACTER SET utf8)
'30'

【讨论】:

  • 这很奇怪。规格说明The return type of COALESCE() is the aggregated type of the argument types. 我希望这意味着返回将是一个数值......真的很奇怪!谢谢。
  • 您使用的是用户定义的变量,而不是带有已定义数据的列
  • 好的,谢谢你的详细信息。我扩展了我的问题,纯粹是为了了解发生了什么,而不是修复/修改 mySql 语法。如果您还有更多的 cmets,我会全力以赴 :-)
  • 我明白了,我喜欢带有 DECLARe 可能性的存储过程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
相关资源
最近更新 更多