sql、javax.persistence.criteria:根据字符串列表检查数据库 table 列,其中包含逗号分隔的字符串值

sql, javax.persistence.criteria: check a database table column with comma separated string values against a list of strings

我有一个数据库 table 列,其中包含逗号分隔的字符串值,如下所示:

id mycolumn
-- --------
1  A
2  A, B
3  A, B, C

我无法更改它,因为它是旧的定制程序数据库。

我想根据字符串列表检查 mycolumn

第一次查询列表 ['A'] 应该是 return 记录 1

针对列表 ['A','B'] 的第二个查询应该是 return 条记录 1,2

第三次查询列表 ['A','B','C'] 应该是 return 条记录 1,2,3

我需要一个 sql (postgres) 语句和 java 实现 javax.persistence.criteria.CriteriaBuilderjavax.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 中,在带有包含运算符 <@WHERE 子句中使用 string_to_array(mycolumn,','),例如

SELECT * FROM t
WHERE string_to_array(mycolumn,',') <@ ARRAY['A','B','C']

请记住,您必须创建一个与此条件相对应的索引,以防您处理大型 table,例如一个 GIN 索引。

CREATE INDEX idx_t_mycolumn_gin ON t USING gin (string_to_array(mycolumn,','));

演示:db<>fiddle