Coalesce 函数如何处理数据类型
Posted
技术标签:
【中文标题】Coalesce 函数如何处理数据类型【英文标题】:How Coalesce function deals with datatype 【发布时间】:2020-01-29 06:16:37 【问题描述】:我不熟悉 REDSHIFT 中的 COALESCE 功能。我在 mysql 和 Redshift 中运行了以下四个查询。
第一个和第二个查询在 mysql 和 redshift 中都按预期执行。但是对于第三和第四个查询,我在 mysql 和 Redshift 中得到了两个不同的结果。这表现如何?
select COALESCE(null,null,1)
-> 1
select COALESCE(null,null,'John')
-> 1
select COALESCE(null,null,1,'John')
->(红移:error
,mysql:1
)
select COALESCE(null,null,'John',1)
->(红移:error
,mysql:John
)
另外,这个查询应该在 mysql 中给出错误,但它已经成功了 任何帮助表示赞赏
【问题讨论】:
"这个查询应该在 mysql 中报错,但它已经成功了" ? MySQL COALESCE() 函数返回列表中的第一个非空值。你的 MySQL #3 & #4 结果是正确的 另外,在 MySQL 中select COALESCE(null,null,1,'John') UNION ALL select COALESCE(null,null,'John',1)
也是正确的!
【参考方案1】:
Amazon Redshift Database Developer Guide 声明:
NVL 表达式与 COALESCE 表达式相同。 NVL 和 COALESCE 是同义词。
语法
NVL | COALESCE ( expression, expression, ... )
NVL 或 COALESCE 表达式返回第一个表达式的值 在不为空的列表中。如果所有表达式都为空,则结果 一片空白。 当找到一个非空值时,剩下的表达式 列表未评估。
当您想要返回备份时,这种类型的表达式很有用 当首选值丢失或为 null 时的值。为了 例如,查询可能会返回三个电话号码之一(手机、家、 或工作,以该顺序),以表格中最先找到的为准(不是 空)。
如果您收到错误,这可能意味着返回值数据类型与记录集字段的数据类型或任何其他必须接受返回值的结构不匹配。
PS。你会显示错误信息吗?
【讨论】:
select coalesce(null,null,1,'John') 查询给出此错误:SQL 异常:错误:整数输入语法无效:“John” @SRG 文档中有错误,或者有一些查询预处理步骤执行数据类型检查并生成错误(它可能都在 SQL 服务器端,但文档中没有描述,以及在客户端或某些中间服务中)。我建议对每个值使用显式 CAST 到最兼容的数据类型(所示案例中的字符串类型)。但是 MySQL 不会执行这样的预检查。【参考方案2】:虽然它没有写在文档中,但它适用于兼容的数据类型。 Integer 和 varchar 无法比较。
当您提供列名而不是硬编码值时,错误会变得更加明显。尝试执行此操作:
select coalesce(integer_column, varchar_column) from a_table;
你会收到这样的错误:
coalesce 类型 integer 和 varchar 无法匹配。
【讨论】:
以上是关于Coalesce 函数如何处理数据类型的主要内容,如果未能解决你的问题,请参考以下文章
prometheus:prometheus如何处理数据类型溢出?