Tengo una columna de tabla de base de datos con valores de cadena separados por comas como este:
id mycolumn -- -------- 1 A 2 A, B 3 A, B, CNo puedo cambiar esto, porque es una base de datos personalizada antigua.
Quiero comprobar mycolumn contra una lista de cadenas:
la primera consulta contra la lista ['A'] debe devolver el registro 1
la segunda consulta contra la lista ['A', 'B'] debe devolver los registros 1,2
la tercera consulta contra la lista ['A', 'B', 'C'] debe devolver los registros 1,2,3
Necesito una declaración sql (postgres) y además una implementación de java con javax.persistence.criteria.CriteriaBuilder y javax.persistence.criteria.Predicate .
Muchas gracias por tus consejos, Ana.
editar: Aquí mi solución para la parte 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))); }En PostgreSQL use string_to_array(mycolumn,',') en la cláusula WHERE con el operador de contención <@ , por ejemplo
SELECT * FROM t WHERE string_to_array(mycolumn,',') <@ ARRAY['A','B','C'] Tenga en cuenta que debe crear un índice que corresponda a esta condición, en caso de que esté tratando con una tabla grande, por ejemplo, un índice GIN .
CREATE INDEX idx_t_mycolumn_gin ON t USING gin (string_to_array(mycolumn,',')); Demostración: db<>fiddle