2017-01-09 4 views
0

Теперь я хочу использовать функцию «как» с JOOQ для выбора данных, включая массив строковых данных, с учетом нечувствительности к регистру и партициального соответствия.Как использовать функцию «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); 

Моя цель заключается в выборе данных по делу -чувствительный и партициальный-совпадение типа: Например, используя likeIgnoreCase («OraNge») или подобное («% ang%»)?

Развивать ниже кода с помощью функции LIKE:

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

Как я могу использовать как функцию?

Благодарим вас в Advance.

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^