我现在想在JOOQ中使用'like'函数来选择数据,包括不区分大小写和元素匹配的字符串数据数组。
表架构是:
CREATE TABLE favorites (
id int,
items varchar(100)[]
);
示例数据是:
INSERT INTO favorites (id, items)
VALUES (1, '{orange, lemon, banana}');
INSERT INTO favorites (id, items)
VALUES (2, '{apple, grape}');
要获取第一个数据,SQL就像:
SELECT id, items FROM favorites WHERE 'orange' = ANY (items);
我的目标是通过区分大小写和部分匹配来选择数据:例如,使用likeIgnoreCase(“OraNge”)或类似(“%ang%”)?
使用LIKE函数开发以下代码:
Connection connection = ...;
DSLContext context = DSL.using(connection, ...);
List<Table> table = context.select().from(TABLE).fetchInto(Table.class);
我如何使用类似功能?
先谢谢你。
答案 0 :(得分:0)
PostgreSQL value = ANY (array)
运算符无法匹配LIKE
谓词之类的值。您需要使用实际的LIKE
谓词。在SQL中,你会写:
SELECT id, items
FROM favorites
WHERE EXISTS (SELECT * FROM unnest(items) AS t(item) WHERE item ILIKE '%OraNge%')
或者,使用jOOQ:
context.select(FAVORITES.ID, FAVORITES.ITEMS)
.from(FAVORITES)
.whereExists(
selectFrom(unnest(FAVORITES.ITEMS).as("t", "item")
.where(field(name("item", String.class)).likeIgnoreCase("%OraNge"))
)
.fetch();
jOOQ版本一如既往地假设您有静态导入:
import static org.jooq.impl.DSL.*;
答案 1 :(得分:0)
此外,以下是使用LIKE的几种方法。您始终可以使用jOOQ LIKE谓词,请参阅其文档。在我的第二个例子中,我在字符串中使用sql语法,只是为了证明你可以。您也可以像使用字符串一样使用contains / startsWith / endsWith。
jooq.dsl()
.select()
.from(MY_TABLE)
.where(Employee.EMPLOYEES.LAST_NAME.like("ER")));
jooq.dsl()
.select()
.from(EMPLOYEES)
.where(Employee.EMPLOYEES.LAST_NAME.like("ER"))
.and("first_name like ?", "ST"));