运行此脚本:
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 |
-------------------------------
如何更改查询以获得预期结果?
答案 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)