如何使用JOOQ检查PostgreSQL数组类型字段是否为空
PostgreSQL数组字段空值判断的正确jOOQ写法
原代码的问题在于误用了DSL.length()函数:PostgreSQL的length()是计算字符串字节长度的函数,对数组类型字段使用时,返回的是数组二进制表示的长度,而非数组内的元素个数,因此无法正确判断数组是否为空。
正确的做法是使用PostgreSQL专门的cardinality()函数,它用于返回数组的元素数量,空数组返回0,非空数组返回对应元素个数。结合你的需求,修改后的Kotlin代码如下:
考虑数组为NULL的场景
如果需要将NULL的数组字段也视为“空”:
where = if (arrayExists) { // 查询数组非空(有元素且不为NULL) where.and(DSL.cardinality(USERS.ACCOUNT_IDS).greaterThan(0)) } else { // 查询数组为空(无元素或为NULL) where.and(DSL.or( DSL.cardinality(USERS.ACCOUNT_IDS).equal(0), USERS.ACCOUNT_IDS.isNull )) }
数组字段不会为NULL的场景
如果确认数组字段不可能为NULL,可以简化为:
where = if (arrayExists) { where.and(DSL.cardinality(USERS.ACCOUNT_IDS).greaterThan(0)) } else { where.and(DSL.cardinality(USERS.ACCOUNT_IDS).equal(0)) }
DSL.cardinality()是jOOQ对PostgreSQLcardinality()函数的封装,能准确获取数组的元素数量,以此作为判断依据就能达到预期的空值判断效果。
内容的提问来源于stack exchange,提问作者Hantsy
相关产品推荐
相关产品推荐

