SQL coalesce(): 组合列有什么类型?

SQL coalesce(): what type does the combined column have?

假设我使用 coalesce() 将 select 中的两列合并为一列,随后围绕 select.

构建了一个视图

表格:

values_int
id INTEGER(11) PRIMARY KEY
value INTEGER(11)

values_varchar
id INTEGER(11) PRIMARY KEY
value VARCHAR(255)

vals
id INTEGER(11) PRIMARY KEY
value INTEGER(11) //foreign key to both values_int and values_varchar

values_intvalues_varchar 之间的主键是唯一的,这让我可以做到:

SELECT vals.id, coalesce(values_int.value, values_varchar.value) AS value
FROM vals
JOIN values_int ON values_int.id = vals.value
JOIN values_varchar ON values_varchar.id = vals.value

这会生成漂亮的组合视图,其中包含 ID 列和组合值列,其中包含来自其他两个表的实际值组合成一个列。

在需要时有一些漫无边际的想法(很可能是错误的): 我问这个的原因是这个设计的替代方案将所有三个表合并为一个,其中一列为 INT 值,另一列为 VARCHAR。这当然会在两列中产生大量 NULL 值,但为我节省了 JOIN。出于某种原因,我不喜欢该解决方案,因为它需要额外的类型检查来选择正确的列并处理 NULL 值,但也许这个呈现的设计也需要相同的(如果结果列实际上是 VARCHAR)。我希望它实际上将 WHERE 子句向下传递到源视图(以便该列本身没有类型)但我可能错了。

您的查询应该明确清楚,在本例中 mysql 使用的是 varchar。

为了清楚起见,我会这样写这个查询

coalesce(values_int.value,cast(values_varchar.value as integer), 0) 

coalesce(cast(values_int.value as varchar(20)),values_varchar.value,'0') 

您应该输入最后一个值,除非您希望在两列都为空的情况下该列为空。

Returns 具有最高数据类型优先级的表达式的数据类型。如果所有表达式都不可为空,则结果类型为不可为空。

因此在您的情况下,类型将是 VARCHAR(255)

Lets say I use coalesce() to combine two columns into one

不,这不是 COALESCE 功能的使用。如果列值为空,它用于选择提供的默认值。因此,在您的情况下,如果 values_int.value IS NULL 那么它将 select values_varchar.value

中的值
coalesce(values_int.value, values_varchar.value) AS value

如果您想合并数据,请使用连接运算符 (OR) CONCAT() 函数,就像

concat(values_int.value, values_varchar.value) AS value

自己验证。签入 MySQL 的一种简单方法是描述您创建的用于捕获动态列的视图:

mysql> CREATE VIEW v AS
    -> SELECT vals.id, coalesce(values_int.value, values_varchar.value) AS value
    -> FROM vals
    -> JOIN values_int ON values_int.id = vals.value
    -> JOIN values_varchar ON values_varchar.id = vals.value;
Query OK, 0 rows affected (0.01 sec)

现在 DESCRIBE v 将向您展示什么是什么。请注意,在 MySQL 5.1 下,我看到该列为 varbinary(255),但在 5.5 下,我看到 varchar(255).