当使用jooq-postgres-扩展并在查询中插入一个字段值为IntegerRange.integerRange(10, true, 20, true)的行时,它将被转换为cast('[10,20]' as int4range).

有趣的是,如果我运行查询select cast('[10,20]' as int4range),我得到的是[10,21),它不再是一个包含区间.

我的问题是:当我读回Jooq中的这一行时,integerRange.end现在是21而不是20.

这是一个已知的问题吗?有没有解决办法,而不是明显的上限减1?

推荐答案

JOOQ 3.17 RANGE type support (#2968)区别于

  • 离散范围(例如DateRangeIntegerRangeLongRangeLocaldateRange)
  • 非离散范围(例如BigDecimalRangeLocalDateTimeRangeOffsetDateTimeRangeTimestampRange)

与在PostgreSQL中非常相似,jOOQ将它们视为相同的:

WITH r (a, b) AS (
  SELECT '[10,20]'::int4range, '[10,21)'::int4range
)  
SELECT a, b, a = b
FROM r;

结果是:

|a      |b      |?column?|
|-------|-------|--------|
|[10,21)|[10,21)|true    |

如您所见,PostgreSQL本身并不区分这两个相同的范围.虽然jOOQ维护您提供的信息,但它们在PostgreSQL中是相同的值.PostgreSQL本身不会将[10,20]::int4range echo 到jOOQ,因此您无法在jOOQ中保持此值.

如果是need,那么为什么不使用BigDecimalRange,这相当于PostgreSQL中的numrange:

WITH r (a, b) AS (
  SELECT '[10,20]'::numrange, '[10,21)'::numrange
)  
SELECT a, b, a = b
FROM r;

现在,你得到的是:

|a      |b      |?column?|
|-------|-------|--------|
|[10,20]|[10,21)|false   |

Postgresql相关问答推荐

如何在postquist中修剪第一/后文件名

将列类型从文本[]更改为jsonb[]

Jsonb[]字段中的PostgreSQL否定&q;-0.0

有没有一种方法可以在参数中添加密码,并在批处理文件中需要时自动获取密码?

是否可以调整 PostgreSQL 中的数组以适应 IN 运算符?

从 PostgreSQL 中的每个组中抽取 N 个样本

带有 -C 选项的 pg_restore 不会创建数据库

无法登录 PostgreSQL 数据库

将 SELECT 结果作为参数传递给 postgreSQL 函数

在PostgreSQL中 Select 数组列的总和

如何使用 postgresql 中的存储过程将数据插入表中

django.db.utils.IntegrityError:duplicate key value violates unique constraint "django_content_type_pkey"

无法安装 psycopg2 Ubuntu

在 MAC OS X 10.6 for PostgreSQL 上设置 SHMMAX 等值

如何使用 Django Migrations 重新创建已删除的表?

Postgres Npgsql 连接池

如何为 Postgres psql 设置时区?

在 postgres 中存在不同的 string_agg 问题

Ruby 中 DateTime 的毫秒分辨率

postgresql NOT ILIKE 子句不包含空字符串值