Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск LIKE / 14 сообщений из 14, страница 1 из 1
23.05.2011, 18:54
    #37275204
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
IBM DB2 9.7
поиск с использованием шаблона:
Код: plaintext
select name from user.table1 where name like '%'||pattern||'%'

SQL0132N Неверный предикат LIKE или скалярная функция POSSTR - первый операнд не является строчным выражением или второй операнд не является строкой. Неверная скалярная функция LOCATE или POSITION - первый операнд не является строкой или второй операнд не является строчным выражением.

Поиск дал решение вида:
Код: plaintext
select name from user.table1 where locate(pattern,name)<> 0 
Посмотрел план, индекс по name используется,т.е. вроде бы все приемлимо.

Альтернативы нет?
...
Рейтинг: 0 / 0
24.05.2011, 15:41
    #37276837
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
если pattern вида 'p1%p2', то результат
Код: plaintext
select name from user.table1 where locate(pattern,name)<> 0 
может отличаться от

Код: plaintext
select name from user.table1 where name like '%'||pattern||'%'

Зашел в тупик.
...
Рейтинг: 0 / 0
24.05.2011, 16:32
    #37277011
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
1.
Символы '%' и '_' в шаблоне предиката LIKE имеют специальное значение, а в locate - нет.

2.
Начиная с 9.7.4 в шаблоне like можно использовать выражения с полями типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select *
from table(values
  'иванов'
, 'иван'
, 'иванович'
, 'петров'
, 'петр'
, 'сидоров'
) t(n)
join table(values
  '%иван%'
, '%петр%'
, 'сид%ов'
) p(n) on t.n like p.n

3.
Можно использовать регулярные выражения для этого на основе XQuery ф-ции matches.
...
Рейтинг: 0 / 0
24.05.2011, 16:42
    #37277041
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Спасибо,Марк. 2-й пункт-это то, что надо.
Буду обновляться.
...
Рейтинг: 0 / 0
25.05.2011, 00:38
    #37277654
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Начиная с 9.7.4 в шаблоне like можно использовать выражения с полями типа:

Между прочим, ещё один пример фичи неоднозначной полезности. Казалось бы, замечательно - появилась новая возможность. Но я сильно подозреваю, что теперь ей начнут пользоваться, когда можно и лучше было бы без неё обойтись. Запрет на выражение в LIKE имел смысл для принуждения, чтобы люди пользовались только константами, а оптимизатор мог эти константы разобрать и построить более оптимальный план. А что оптимизатор сможет сделать с шаблоном, который до выполнения SQL-выражения ему неизвестен?

В Oracle уже давным давно можно в like использовать hostvar в качестве шаблона. В результате мне так и не удалось уговорить разработчика одной используемой нами системы при задании произвольного фильтра по выборке подставлять туда константу (это при том, что тот запрос и так динамически генерируется), но на пользу это никак не могло пойти (ни скорости выполнения запросов, ни разработчику, да и нам тоже).
...
Рейтинг: 0 / 0
25.05.2011, 13:57
    #37278472
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Очень нужная фича. В ГУИ организовать фильтрацию справочников, документов и пр., без like придется выдумывать велосипед.
...
Рейтинг: 0 / 0
26.05.2011, 23:36
    #37281622
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Когда запрос формируется динамически, да ещё при применении GUI-фильтра (что наверняка означает, что сервер не бомбардируют тысячи подобных запросов в секунду), что мешает подставлять константу в LIKE?
...
Рейтинг: 0 / 0
27.05.2011, 10:56
    #37282042
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
А никто не говорил, что запрос строится динамически, а если в запросе используется функция , потому что к таблицы у юзера нет доступа, то в like передается шаблон и все замечательно.
...
Рейтинг: 0 / 0
27.05.2011, 17:52
    #37283141
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Но ведь если не динамически, так это ещё хуже. Я предпочитаю давать серверу максимум информации для оптимизации. Конечно, при этом на сервер ложится лишняя работа по разбору и прекомпиляции, но если запросы идут не очень часто, то беспокоиться не о чем, а на средних и больших объёмах данных это окупается.

(Поскольку я не знаю вашей ситуации, то мысленно подставляю свою. Где имеются десятки миллионов документов (авиабилеты) и десятки полей с разнообразными (попросту произвольными) условиями фильтрации по любым полям. У вас, наверное, много меньше того и другого, и потому вам действительно наплевать. Но я бы всё равно побеспокоился).
...
Рейтинг: 0 / 0
30.05.2011, 14:23
    #37285453
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
1. у пользователя должны быть права на все таблицы (или view) используемые в запросе.
2. при изменении запроса нужно лезть в код приложения (это не есть хорошо).
3. если запрос использует временные таблицы (т.е. превращается в простыню), то п.2 превращается в ад.
4. Время на подготовку запроса может быть сравнимо с временем выполения (имхо).

Ну и опять же опыт людей в данном форуме подсказывает, что при развитии проекта поддерживать процедуры/функции легче, чем внутри приложений.
...
Рейтинг: 0 / 0
30.05.2011, 15:10
    #37285543
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Troglodit1. у пользователя должны быть права на все таблицы (или view) используемые в запросе.
И в чём проблема?
2. при изменении запроса нужно лезть в код приложения (это не есть хорошо).
Куда-то ведь всё равно придётся лезть?
3. если запрос использует временные таблицы (т.е. превращается в простыню), то п.2 превращается в ад.
Какие такие "временные таблицы"? И если это то, о чём я подумал - ну, используйте VIEW, если вас большой запрос смущает.
4. Время на подготовку запроса может быть сравнимо с временем выполения (имхо).
Вот если будет, тогда другое дело.
Ну и опять же опыт людей в данном форуме подсказывает, что при развитии проекта поддерживать процедуры/функции легче, чем внутри приложений.
Чем легче-то? Так и так база и приложения должны быть согласованы друг с другом, код должен храниться в системе управления версиями, приложение должно отказываться работать, если его версия не соответствует базе.
...
Рейтинг: 0 / 0
30.05.2011, 15:39
    #37285628
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
Victor MetelitsaИ в чём проблема?

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

Куда-то ведь всё равно придётся лезть?


Я может неправильно выразился. Конечно код придется менять,но в SQL процедуре, при этом для клиента это все будет прозрачно,плюс человек(если проект пишет больше одного), который пишет прикладную часть, не загоняется,а пользуется готовой процедурой. Если приложений несколько (веб,десктоп,мобильный), то зоопарк с различными ЯП проще устранить, когда вся бизнес-логика находится в БД.



Чем легче-то? Так и так база и приложения должны быть согласованы друг с другом, код должен храниться в системе управления версиями, приложение должно отказываться работать, если его версия не соответствует базе.
Это в идеале, по факту такое далеко не всегда.

Пример(выдуманный)
есть вагоны, которые принадлежат юрлицу.
Программа предоставляет информацию по местонахождению, грузе и пр.

Клиенту нельзя давать доступ на таблицу, поскольку это коммерческая инф. других юр.лиц.
Вагоны имеют свойства продаваться другим юр.лицам,но история должна показываться текущему клиенту.
У клиента может быть несколько юр. лиц и он хочет единый интерфейс.
...
Рейтинг: 0 / 0
30.05.2011, 23:26
    #37286410
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
TrogloditПроблема в том, что пользователям не всегда нужно давать права на таблицы.

View и SQL-функции есть (я их за view с параметрами считаю).
Я может неправильно выразился. Конечно код придется менять,но в SQL процедуре, при этом для клиента это все будет прозрачно,плюс человек(если проект пишет больше одного), который пишет прикладную часть, не загоняется,а пользуется готовой процедурой.

Не знаю насчёт "загоняется". Но ведь нельзя сделать select .. from процедура. Это значит, что надо будет делать процедуры на каждый чих? И/или делать запросы в них чудовищно неэффективными, a la
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
where 
  (:param1 is null or field1=:param1)
  and
  (:param2 is null or field1=:param2)
  and 
  ...
Фу. А потом нам говорят, что у нас слишком слабый сервер для их крутой суперсистемы.
Если приложений несколько (веб,десктоп,мобильный), то зоопарк с различными ЯП проще устранить, когда вся бизнес-логика находится в БД.

Абстрактно не могу не согласиться, конкретно надо смотреть. Учитывая существование view и sql-функций.

Чем легче-то? Так и так база и приложения должны быть согласованы друг с другом, код должен храниться в системе управления версиями, приложение должно отказываться работать, если его версия не соответствует базе.
Это в идеале, по факту такое далеко не всегда.

Но надо, чтобы было всегда.
Пример(выдуманный)
есть вагоны, которые принадлежат юрлицу.
Программа предоставляет информацию по местонахождению, грузе и пр.

Клиенту нельзя давать доступ на таблицу, поскольку это коммерческая инф. других юр.лиц.
Вагоны имеют свойства продаваться другим юр.лицам,но история должна показываться текущему клиенту.
У клиента может быть несколько юр. лиц и он хочет единый интерфейс.

Вот что можно было делать ещё в DB2 2.1 for OS/2, да наверняка и до этого на мейнфреймах тоже:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create view some_sensivite_view
select x.*
from some_sensivite_table x
where exist
  (select *
   from some_sensivite_table_rights y
     where x.section = y.section and y.user = current user)
with check option   

some_sensivite_table - таблица, часть которой мы показываем текущему юзеру, а часть не показываем.
Данные разбиты на секции.

some_sensivite_table_rights - там пары - (user, section)

Юзера не имеют права на указанные таблицы, а только на указанный view.

Дальнейшее, полагаю, понятно, и что идею можно развивать - тоже.
...
Рейтинг: 0 / 0
30.05.2011, 23:52
    #37286434
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск LIKE
В целом согласен. Спасибо за развернутый ответ, возможно придется сделать так как вы говорили.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск LIKE / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]