2014-01-21 3 views
0

Я хотел бы найти строку таблицы, где желаемое значение имеет форму A9-B19-C12-D1. Таким образом, переменные буквы сопровождаются переменными цифрами, разделенными на - каждый. Длина не фиксирована, например, она также может быть только A9 или A9-D1.Как создать сопоставление шаблонов переменных для поиска базы данных?

Меня интересуют только письма. Теперь у меня есть 4 буквы A, B, C, D, и я хочу запустить запрос от postgres db, что есть запись в формате выше.

Могу ли я сделать это со следующим утверждением?

SELECT * FROM mytable t WHERE t.entry LIKE 'A%B%C%D%'; 

Если это правильно: как я мог сформулировать NamedQuery, где я мог бы предоставить письма в качестве переменных параметров?

+0

Отправляясь на один шаг назад, я бы сначала спросил, почему есть один столбец с подобной структурой. В зависимости от варианта использования, это может заставить sens e переосмыслить дизайн таблицы вместо того, чтобы делать очень неэффективный LIKE-запрос здесь. Только мои два цента :) –

ответ

1

Попробуйте использовать SIMILAR TO с reqular выражением A\d+(-B\d+(-C\d+(-D\d+)?)?)?

@NamedNativeQueries({ 
    @NamedNativeQuery(
    name = "finDesiredData", 
    query = "select * from mytable t where t.entry SIMILAR TO :ent", 
     resultClass = MyTable.class 
    ) 
}) 

Я бы лично использовать Java StringBuffer для конкатенации буквы в правильном регулярном выражении.

+0

Мне это показалось, что «похожее» технически стандартно, но не реализовано многими другими БД, преобразуется в реальное регулярное выражение Pg и, как правило, не велико. Лучше использовать PCRE и оператор '~' для начала. –

0

Ммм, я не знаю, если я понимаю ваш вопрос, но вы можете установить namedQuery так:

query.setParamter("param1", "%" + 9 + "%"); 
query.setParamter("param2", "%" + 1 + "%"); 
1

Вы можете попробовать использовать regexp_replace функции в PostgreSQL. По существу, используя select regexp_replace('A9-B19-C12-D1', '[0-9]|-', '','g') as letters, возвращается строка, которая равна ABCD.

Аналогичным образом, select regexp_replace('A9-D1', '[0-9]|-', '','g') возвращает AD.

Используя эту информацию, вы можете написать свои запросы, связанные с выходом функции regexp_replace. т.е. SELECT * FROM mytable t WHERE regexp_replace(t.entry, '[0-9]|-', '','g')='ABCD' ;.

Я верю, что вы можете также индексировать столбец таблицы на выходе своей функции, но я оставлю это для вас для исследования. Вы также можете посмотреть, используя пользовательские функции SQL Functions Returning Sets (я думаю, это то, что вы подразумеваете под именованными запросами).

См SQL Fiddle example

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