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

时间:2013-07-09 16:34:05

标签: java null field h2 group-concat

运行此脚本:

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

如何更改查询以获得预期结果?

1 个答案:

答案 0 :(得分:3)

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

然而,MySQL并不像那样工作。 H2支持MySQL的compatibility mode,其行为不同。请注意,在使用MySQL模式时,H2仍然与MySQL不是100%兼容,但这方面已经改变。

如果您使用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)