jOOQ Postgres PERCENTILE_CONT & MEDIAN Проблема с приведением типа - PullRequest
0 голосов
/ 08 апреля 2020

Приведение типов данных не работает в пределах median() или percentileCont(). Приведение типов данных прекрасно работает с другими агрегатными функциями, такими как max() и min(). Postgres запросов, которые создаются в результате, показывают, что приведение типов не применяется в конечном результате. Ниже приведены фрагменты из jOOQ и Postgres для справки. На данный момент у меня нет обходного пути или знания открытого билета на эту проблему.

Любое направление будет приветствоваться!


MEDIAN

jOOQ Snippet
selectFields.add(
    median(
            field(String.format("%s.%s", a.getDataSourceName(), a.getField()))
                .coerce(Double.class)) // Seems to not successfully coerce data types
        .as(
            String.format(
                "%s.%s.%s", a.getDataSourceName(), a.getField(), "median")));
SQL Выход
select 
  tableA.columnA, 
  percentile_cont(0.5) within group (order by tableA.columnA) as "tableA.columnA.median" 
from tableA
group by tableA.columnA 
limit 100;

ERROR: function percentile_cont(numeric, text) does not exist


PERCENTILE_CONT

Фрагмент jOOQ
selectFields.add(
    percentileCont(a.getPercentileValue())
        .withinGroupOrderBy(
            field(String.format("%s.%s", a.getDataSourceName(), a.getField()))
                .coerce(Double.class)) // Seems to not successfully coerce data types
        .as(
            String.format(
                "%s.%s.%s", a.getDataSourceName(), a.getField(), "percentile_" + Math.round(a.getPercentileValue() * 100))));
SQL Выход
select 
  tableA.columnA, 
  percentile_cont(0.0) within group (order by tableA.columnA) as "tableA.columnA.percentile_0" 
from tableA.columnA
group by tableA.columnA
limit 100;

ERROR: function percentile_cont(numeric, text) does not exist


POSTGRES - Это работает из-за приведения типа

select 
    percentile_cont(0.5)
    within group (
        order by tableA.columnA::INTEGER
    )
    as "tableA.columnA.median" 
from tableA.columnA 
group by (select 1)

https://www.jooq.org/javadoc/latest/org.jooq/module-summary.html

1 Ответ

1 голос
/ 09 апреля 2020

Вы не ищете принуждение, что в jOOQ-говорит означает изменение только типа данных в клиенте без уведомления сервера. Это в основном полезно при получении данных какого-либо типа (например, Integer), несмотря на то, что jOOQ создает другой тип данных (например, BigInteger), в противном случае. См. Javado c на Field.coerce()

В отличие от приведения, принуждение не влияет на то, как база данных видит тип поля.

// This binds an int value to a JDBC PreparedStatement
DSL.val(1).coerce(String.class);

// This binds an int value to a JDBC PreparedStatement
// and casts it to VARCHAR in SQL
DSL.val(1).cast(String.class);

Клири, вы хотите Field.cast(), вместо этого, как в вашем примере, где вы на самом деле использовали приведение tableA.columnA::INTEGER.

...