Текущее время: Сб, июл 19 2025, 15:45

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пт, апр 03 2009, 11:26 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Подскажите, как заставить оператор like вести поиск без учёта регистра?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пт, апр 03 2009, 11:55 
Менеджер
Менеджер

Зарегистрирован:
Вт, авг 17 2004, 13:14
Сообщения: 664
Откуда: Москва
Пол: Мужской
никак. Для этого у САП в ряде таблиц есть поля-дублеры. Там символы хранятся в верхнем регистре.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пт, апр 03 2009, 13:09 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
жаль :(
Просто дублировать в верхнем регистре какраз и не хотелось, таблица и так неприличного размера получилась.

А средствами движка БД (oracle) никак в этом случае не соптимизировать? Нужны собственно только значения первичного ключа (цифровой ID), по условию LIKE длинное_текстовое_поле.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пт, апр 03 2009, 13:25 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, май 14 2007, 13:05
Сообщения: 561
Откуда: Москва
pberezin написал:
средствами движка БД (oracle) никак в этом случае не соптимизировать?

Попробуйте Native SQL - там можно использовать SQL - словарь Oracle.
Если не ошибаюсь, там есть функция UPPER

_________________
Sapere aude!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пт, апр 03 2009, 16:04 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
попробовал - работает быстро но неправильно. Похоже САП изобрёл какуюто свою уникальную кодировку символов - если затребовать средствами native sql выражения типа UPPER(поле) LOWER(поле), то там такие чудеса с некоторыми русскими буквами происходят.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пн, апр 06 2009, 10:11 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Ну вместо преобразования регистра строк, можно воспользоваться REGEX_SUBSTR и програмно переводить LIKE что-то в регулярное выражение (для Oracle).
Только мне не очень нравится идея использования специфичных фич конкретной СУБД.

ИМХО, вариант от САПа с дублированием столбцов таблицы - самый нормальный при текущей реализации OpenSQL.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пн, апр 06 2009, 10:21 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 26 2006, 15:07
Сообщения: 227
А еще можно сделать комбинации всевозможных вариантов слова. (аб Аб аБ АБ) добавить их в условие со связкой OR . Их всего ничего :D 2 в степени количества букв, исключая пробелы. Так что, если поле не длинное, то вполне подойдет....


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пн, апр 06 2009, 12:28 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
вариант от САПа с дублированием столбцов таблицы - самый нормальный


Както не хочется 4 млн.строк (по 64 символа...с перспективой роста так до 10 млн) задваивать. Мне мой вариант понравился больше - база увеличивается всего-лишь на 1/8, ну и плюс добавляется пара функций конверсии (одна при загрузке этого эпического справочника, вторая при вывал результатов LIKE на экран)

Цитата:
можно воспользоваться REGEX_SUBSTR и програмно переводить LIKE что-то в регулярное выражение (для Oracle).


Это понятно. Но там скорее всего та-же проблема с кодировками оракла вылезет. Я так толком и не разобрался, почему корёжатся некоторые русские буквы при передаче их через EXEC SQL. Возможно там некую sql-команду указания кодовой страницы надо передавать. Х.з., в общем отказался от идеи напрямую в оракл лезть.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пн, апр 06 2009, 13:10 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Ну я за вариант САПы, потому как стандарт.
В вашей реализации (которая, безусловно, сильно лучше стандартной) один минус - нужно знать принцип хранения и производить преобразования. Вот если бы САП тоже использовал битовые маски и умел по умолчанию правильно отображать таблицы с таким содержимым...

По кодировкам:
если юникод - то проблемы быть не должно в принципе.
иначе надо приводить к кодировке БД (посмотреть можно путем select * from props$ where name='NLS_CHARACTERSET') в ABAP'е.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пн, апр 06 2009, 13:19 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, мар 03 2009, 12:33
Сообщения: 141
pberezin написал:
Выкрутился иначе - сконвертил все тексты в таблицы в нижний регистр (чтоб like работал), и добавил туда-же битовые маски, по которым строку текста можно восстановить обратно в регистро-зависимую. Получилось довольно компактно (в плане хранения в БД).

а можно для примера 2 столбца привести. Хочется понять, что из себя представляет битовая маска :shock:


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Пн, апр 06 2009, 14:45 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
ну например - текст в таблице БД это поле CHAR64. Добавляем 64-битное поле в таблицу (т.к. в САПе такого нету, делаем два 32битных поля INT4). Пишем нехитрый ФМ, который перебирает посимвольно текст (64 символа), и для каждой позиции, где стоит заглавная буква, взводит соответствующий бит в 64-битовой маске. Потом сохраняем получившуюся маску (2 32битных целых числа) и текст переводим в нижний регистр.

В результате SELECT...LIKE будет искать всегда в нижнем регистре, а чтобы вернуть регистр взад при выводе на экран, пишем ещё один ФМ, который считав битовые маски из БД, опять перебирает посимвольно строку текста, и воостанавливает верхний регистр, если соответствующий бит маски = 1


Последний раз редактировалось pberezin Вт, апр 07 2009, 16:30, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Вт, апр 07 2009, 09:41 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, мар 03 2009, 12:33
Сообщения: 141
pberezin написал:
ну например - текст в таблице БД это поле CHAR64. Добавляем 64-битное поле в таблицу (т.к. в САПе такого нету, делаем два 32битных поля INT4). Пишем нехитрый ФМ, который перебирает посимвольно текст (64 символа), и для каждой позиции взводит соответствующий бит в 64-битовой маске. Потом сохраняем получившуюся маску (2 32битных целых числа) и текст переводим в нижний регистр.

В результате SELECT...LIKE будет искать всегда в нижнем регистре, а чтобы вернуть регистр взад при выводе на экран, пишем ещё один ФМ, который считав битовые маски из БД, опять перебирает посимвольно строку текста, и воостанавливает верхний регистр, если соответствующий бит маски = 1

хорошее решение :idea: , спасибо! :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Вт, апр 07 2009, 14:56 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
select * from props$ where name='NLS_CHARACTERSET'


Это я так понимаю считывание некой системной ораклиной таблицы (настройки БД хранит) ?
А куда посмотреть, чтоб определить, Юникодная БД или нет (у нас САП 6.20)?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Вт, апр 07 2009, 15:01 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
pberezin, так в props$ и посмотреть. я другого способа не знаю. но нужен доступ к БД, конечно. или базис спросить.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: WHERE поле LIKE маска - без учёта регистра
СообщениеДобавлено: Ср, апр 08 2009, 08:31 
Специалист
Специалист

Зарегистрирован:
Ср, июл 02 2008, 09:49
Сообщения: 110
Откуда: Старый Оскол
pberezin написал:
ну например - текст в таблице БД это поле CHAR64. Добавляем 64-битное поле в таблицу (т.к. в САПе такого нету, делаем два 32битных поля INT4). Пишем нехитрый ФМ, который перебирает посимвольно текст (64 символа), и для каждой позиции, где стоит заглавная буква, взводит соответствующий бит в 64-битовой маске. Потом сохраняем получившуюся маску (2 32битных целых числа) и текст переводим в нижний регистр.

В результате SELECT...LIKE будет искать всегда в нижнем регистре, а чтобы вернуть регистр взад при выводе на экран, пишем ещё один ФМ, который считав битовые маски из БД, опять перебирает посимвольно строку текста, и воостанавливает верхний регистр, если соответствующий бит маски = 1

Да, действительно, очень остроумно и компактно - маладца.

В качестве дальнейшего усовершенствования можно предложить создать подпрограмму преобразования, чтобы указанные ФМ в случае экранов вызывались автоматом

_________________
Кенни мне больше не нравится, он совсем перестал общаться (c) Cartman, South Park


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB