Текущее время: Вс, июл 20 2025, 08:44

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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