2017-01-09 48 views
0

我現在想用JOOQ中的'like'函數來選擇數據,包括不區分大小寫和部分匹配的字符串數據。如何使用'LIKE'函數來選擇JOOQ字符串數組

表模式是:

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); 

我的目標是選擇通過案例數據-sensitive和partitial-match如:例如,使用likeIgnoreCase(「OraNge」)或類似(「%ang%」)?

要發展下面的代碼與LIKE功能:

Connection connection = ...; 
DSLContext context = DSL.using(connection, ...); 
List<Table> table = context.select().from(TABLE).fetchInto(Table.class); 

我怎麼可以用這樣的功能?

先謝謝您。

回答

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.*; 
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")); 
相關問題