java - sql, javax.persistence.criteria:检查一个用逗号分隔的字符串值与字符串列表的数据库表列
问题描述
我有一个带有逗号分隔的字符串值的数据库表列,如下所示:
id mycolumn
-- --------
1 A
2 A, B
3 A, B, C
我无法更改它,因为它是一个旧的定制器数据库。
我想检查mycolumn
一个字符串列表:
对列表['A'] 的第一个查询应返回记录1
针对列表['A','B'] 的第二个查询应返回记录1,2
针对列表['A','B','C'] 的第三个查询应返回记录1,2,3
我需要一个 sql (postgres) 语句和一个带有javax.persistence.criteria.CriteriaBuilder
and的 java 实现javax.persistence.criteria.Predicate
。
非常感谢你的提示,安
编辑: 这是我对 javax.persitence 部分的解决方案:
public static void arrayContains(final CriteriaBuilder cb, final List<Predicate> where,
final Expression<String> expression, final String values) {
Expression<String> expressionValues = cb.function("string_to_array", String.class, cb.literal(values), cb.literal(", "));
Expression<String> expressionDb = cb.function("string_to_array", String.class, expression, cb.literal(", "));
where.add(cb.isTrue(cb.function("arraycontains", Boolean.class, expressionValues, expressionDb)));
}
解决方案
在 PostgreSQL中,在带有包含运算符string_to_array(mycolumn,',')
的子句中使用,例如WHERE
<@
SELECT * FROM t
WHERE string_to_array(mycolumn,',') <@ ARRAY['A','B','C']
请记住,您必须创建与此条件相对应的索引,以防您处理大型表,例如GIN
索引。
CREATE INDEX idx_t_mycolumn_gin ON t USING gin (string_to_array(mycolumn,','));
演示:db<>fiddle
推荐阅读
- android - 任务':app:installDebug'的执行失败反应本机应用程序
- c# - 在车把模板中添加防伪令牌
- python - 使用 Keras 和 Jupyter 重塑数据
- ms-access - Microsoft Access 数据库 - 从多个条目下载所有附件
- javascript - 鼠标滚轮事件 - 速度/动量
- python - 如何找到与给定坐标对应的二维网格的索引?
- hyperledger-fabric - 在 Hyperledger Fabric Composer 中启动业务网络应用程序时出错 - 多主机对等环境
- python-3.x - 在同一进程中多次运行 Scrapy
- ef-core-2.0 - 无法对自联接多对多关系创建外键约束
- javascript - 如果输入为空白,则防止提交角度表单