Функция PostgreSQL + приведение в jOOQ

Как это утверждение можно выразить с помощью jOOQ?

SELECT version FROM abc ORDER BY string_to_array(version, '.', '')::int[] desc limit 1

Я борюсь с комбинацией функции и приведения.


person Axel Fontaine    schedule 06.12.2014    source источник
comment
Кстати, очень интересная техника упорядочивания... Наконец, пример использования массивов в PostgreSQL :-)   -  person Lukas Eder    schedule 06.12.2014
comment
Это для сортировки номеров версий непосредственно в БД. Это Postgres, и это круто :-)   -  person Axel Fontaine    schedule 06.12.2014
comment
Да, PostgreSQL, кажется, улучшает стандарт SQL:2011, который указывает в 8.2 <comparison predicate>, General Rules, 1) b) ii), что операция сравнения < не определена для массивов... Интересно, однако, дает ли PostgreSQL такие гарантии... похоже, это так   -  person Lukas Eder    schedule 06.12.2014
comment
да, это   -  person Lukas Eder    schedule 06.12.2014


Ответы (1)


У вас есть различные варианты.

Будьте ленивы и оберните все в одно простое SQL-выражение:

Field<Integer[]> f1 = 
    DSL.field("string_to_array(version, '.', '')::int[]", Integer[].class);

Создайте повторно используемую функцию:

Field<Integer[]> stringToIntArray(Field<String> arg1, String arg2, String arg3) {
    return DSL.field("string_to_array({0}, {1}, {2})::int[]", Integer[].class,
        arg1, DSL.val(arg2), DSL.val(arg3));
}

// and then...
Field<Integer[]> f2 = stringToIntArray(ABC.VERSION, ".", "");

Используйте генератор кода для создания встроенной функции и явного приведения ее:

Field<Integer[]> f3 = Routines.stringToArray(ABC.VERSION, DSL.val("."), DSL.val(""))
                              .cast(Integer[].class);

Встроенная функция является частью схемы pg_catalog в базе данных postgres.

Собери это вместе

DSL.using(configuration)
   .select(ABC.VERSION)
   .from(ABC)
   .orderBy(fN.desc()) // place any of f1, f2, f3 here
   .limit(1)
   .fetch();
person Lukas Eder    schedule 06.12.2014