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_int
和 values_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 列和组合值列,其中包含来自其他两个表的实际值组合成一个列。
- 这个组合列有什么类型?
- 当变成视图,然后使用这个组合的 "value" 列通过 WHERE 子句查询时,实际上是如何按类型处理的? IE。
WHERE value > 10
在需要时有一些漫无边际的想法(很可能是错误的):
我问这个的原因是这个设计的替代方案将所有三个表合并为一个,其中一列为 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)
.
假设我使用 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_int
和 values_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 列和组合值列,其中包含来自其他两个表的实际值组合成一个列。
- 这个组合列有什么类型?
- 当变成视图,然后使用这个组合的 "value" 列通过 WHERE 子句查询时,实际上是如何按类型处理的? IE。
WHERE value > 10
在需要时有一些漫无边际的想法(很可能是错误的): 我问这个的原因是这个设计的替代方案将所有三个表合并为一个,其中一列为 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)
.