2017-01-09 1 views
0

이제 JOOQ에서 'like'함수를 사용하여 대소 문자를 구분하지 않고 부분 일치로 문자열 데이터 배열을 포함한 데이터를 선택하려고합니다.'LIKE'함수를 사용하여 JOOQ로 문자열 배열 선택

테이블 스키마는 다음과 같습니다

CREATE TABLE favorites (
    id int, 
    items varchar(100)[] 
); 

샘플 데이터는 다음과 같습니다

SELECT id, items FROM favorites WHERE 'orange' = ANY (items); 

내 목표는 경우에 의해 데이터를 선택하는 것입니다

INSERT INTO favorites (id, items) 
    VALUES (1, '{orange, lemon, banana}'); 
INSERT INTO favorites (id, items) 
    VALUES (2, '{apple, grape}'); 

는 SQL과 같은 것입니다 첫 번째 데이터를 얻으려면 (예 : likeIgnoreCase ("OraNge") 또는 유사 ("% ang %")를 사용합니까?

같은 기능 코드 아래 개발하기 :

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

가 어떻게 기능처럼 사용할 수 있습니까?

미리 감사드립니다.

답변

0

PostgreSQL value = ANY (array) 연산자는 LIKE 술어 같은 값을 비교할 수 없습니다. 대신 실제 LIKE 술어에 의존해야합니다. jOOQ으로,

SELECT id, items 
FROM favorites 
WHERE EXISTS (SELECT * FROM unnest(items) AS t(item) WHERE item ILIKE '%OraNge%') 

을 또는 : SQL에서, 당신은 쓸 것

import static org.jooq.impl.DSL.*; 
0

또한 :

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 버전은, 언제나처럼,이 고정 수입이 가정 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"));