2012-10-18 1 views
0

Я пытаюсь добавить функцию group_concat в hsqldb, чтобы я мог правильно протестировать запрос в качестве теста unit/integration. Запрос отлично работает в mysql, поэтому мне нужно, чтобы он работал в hsqldb (надеюсь).Как добавить group_concat в 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's group_concat. Однако то, что он не будет делать это позволить мне использовать явное ключевое слово, как это:

group_concat(distinct column) 

Есть ли способ, чтобы фактор в отчетливом ключевом слове? Или я могу переписать запрос, чтобы избежать отдельного ключевого слова?

ответ

0

HSQLDB имеет встроенный GROUP_CONCAT и принимает DISTINCT.

http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_aggregate_funcs

На данный момент вы не можете добавить DISTINCT к определенному пользователю функции совокупной, но это выглядит как интересная особенность, чтобы в будущем.

+0

В настоящее время я использую 2.0.0, и похоже, что у него его нет. Может быть, вы имеете в виду более новую версию? Я не могу использовать строку 2.2.x - мои модульные тесты идут намного, гораздо медленнее по какой-то причине, когда dbunit вставляет данные. 2.0.0, похоже, идет на 8-10 раз быстрее. Я написал запрос, чтобы присоединиться к суб-select, который сначала извлекает синонимы, чтобы избежать использования отдельных. Это, похоже, решает проблему, но я надеюсь, что это не сделает ее медленнее. – egervari

+0

Возможно, вам нужно увеличить объем памяти JVM. 2.2.9 вставляет 4 миллиона строк в 12 секунд в базе данных mem:. – fredt

Смежные вопросы