powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск LIKE
14 сообщений из 14, страница 1 из 1
Поиск LIKE
    #37275204
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Поиск LIKE
    #37276837
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если 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
Поиск LIKE
    #37277011
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Поиск LIKE
    #37277041
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо,Марк. 2-й пункт-это то, что надо.
Буду обновляться.
...
Рейтинг: 0 / 0
Поиск LIKE
    #37277654
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начиная с 9.7.4 в шаблоне like можно использовать выражения с полями типа:

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

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

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

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

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

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


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



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

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

Клиенту нельзя давать доступ на таблицу, поскольку это коммерческая инф. других юр.лиц.
Вагоны имеют свойства продаваться другим юр.лицам,но история должна показываться текущему клиенту.
У клиента может быть несколько юр. лиц и он хочет единый интерфейс.
...
Рейтинг: 0 / 0
Поиск LIKE
    #37286410
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Поиск LIKE
    #37286434
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В целом согласен. Спасибо за развернутый ответ, возможно придется сделать так как вы говорили.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Поиск LIKE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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