gpt4 book ai didi

java - H2 - 为什么 GROUP_CONCAT 拒绝具有 NULL 值的行?

转载 作者:行者123 更新时间:2023-12-04 04:50:14 24 4
gpt4 key购买 nike

运行这个脚本:

drop table if exists foo cascade;
create table foo(
id int NOT NULL auto_increment,
start date NOT NULL,
end date
);

insert into foo(start,end) values('2007-01-01', '2007-12-31');
insert into foo(start,end) values('2007-01-01', NULL);

SELECT
COUNT(*) nb,
GROUP_CONCAT(
id || '-' || start || '-' || end
SEPARATOR CHAR(10)
) final
FROM
foo;

为什么 H2 返回这个
-------------------------------
|NB | FINAL |
-------------------------------
|2 | 1-2007-01-01-2007-12-31 |
-------------------------------

代替
-------------------------------
|NB | FINAL |
-------------------------------
|2 | 1-2007-01-01-2007-12-31 |
| | 2-2007-01-01-NULL |
-------------------------------

?

我应该如何更改我的查询以获得预期结果?

最佳答案

对于 H2,运算符 ||默认返回 NULL如果一个运营商是 NULL .此行为与许多其他数据库(包括 PostgreSQL)中的行为相同。

但是,MySQL 不是这样工作的。 H2 支持 compatibility mode对于行为不同的 MySQL。请注意,在使用 MySQL 模式时,H2 仍然不是 100% 兼容 MySQL,但这方面有所改变。

如果您使用 MySQL 模式运行上述语句(set mode mysql 或在数据库 URL 中附加 ;mode=mysql),则结果为:

2   1-2007-01-01-2007-12-31
2-2007-01-01-

以便 NULL转换为空字符串。

可能更好的是不依赖 MySQL 模式,而是使用 CONCAT而不是 || .这是更标准的方式,因为它也适用于其他数据库:
concat(id, '-', start, '-', end)

关于java - H2 - 为什么 GROUP_CONCAT 拒绝具有 NULL 值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17553587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com