2

运行此脚本:

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       |
-------------------------------

?

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

4

1 回答 1

4

对于 H2,如果一个运算符是,则运算符||默认返回。这种行为与许多其他数据库中的行为相同,包括 PostgreSQL。NULLNULL

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

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

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

以便将NULL其转换为空字符串。

可能更好的是不依赖 MySQL 模式,而是CONCAT使用||. 这是更标准的方式,因为它也应该与其他数据库一起使用:

concat(id, '-', start, '-', end)
于 2013-07-10T07:41:43.630 回答