如何以不同的方式将 group_concat 添加到 hsqldb?
Posted
技术标签:
【中文标题】如何以不同的方式将 group_concat 添加到 hsqldb?【英文标题】:How to add group_concat to hsqldb with distinct? 【发布时间】:2012-10-18 21:00:32 【问题描述】:我正在尝试将 group_concat 函数添加到 hsqldb,以便我可以正确地将查询作为单元/集成测试进行测试。该查询在 mysql 中运行良好,所以我需要它在 hsqldb 中运行(希望如此)。
// GROUP_CONCAT
jdbcTemplate.update("DROP FUNCTION GROUP_CONCAT IF EXISTS;");
jdbcTemplate.update(
"create aggregate function group_concat(in val varchar(100), in flag boolean, inout buffer varchar(1000), inout counter int) " +
" returns varchar(1000) " +
" contains sql " +
"begin atomic " +
" if flag then" +
" return buffer;" +
" else" +
" if val is null then return null; end if;" +
" if buffer is null then set buffer = ''; end if;" +
" if counter is null then set counter = 0; end if;" +
" if counter > 0 then set buffer = buffer || ','; end if;" +
" set buffer = buffer + val;" +
" set counter = counter + 1;" +
" return null;" +
" end if;" +
"end;"
);
添加这个聚合函数可以解决大部分问题。它将正确地表现得像 mysql 的 group_concat。但是,它不会让我像这样使用 distinct 关键字:
group_concat(distinct column)
有什么方法可以考虑不同的关键字吗?还是我重写查询以完全避免使用 distinct 关键字?
【问题讨论】:
【参考方案1】:HSQLDB 具有内置的 GROUP_CONCAT 并接受 DISTINCT。
http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_aggregate_funcs
目前您无法将 DISTINCT 添加到用户定义的聚合函数中,但这看起来是一个有趣的功能,将来会允许使用。
【讨论】:
我目前使用的是 2.0.0,但似乎没有。也许您指的是较新的版本?我不能使用 2.2.x 行——当 dbunit 插入数据时,由于某种原因,我的单元测试要慢得多。 2.0.0 似乎要快 8-10 倍。我编写了查询以加入一个子选择,该子选择首先获取同义词以避免使用 distinct。这似乎解决了问题,但我希望它不会让它变慢。 也许你需要增加JVM内存。 2.2.9 在一个 mem: 数据库中在 12 秒内插入 400 万行。以上是关于如何以不同的方式将 group_concat 添加到 hsqldb?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Google Big Query 在 GROUP_CONCAT 上获取不同的值
如何正确使用不同的 group_concat - MYSQL
Hibernate:如何使用 CONCAT 和 GROUP_CONCAT
如何以编程方式将不同单元格的不同图像添加到 tableView (Swift)