Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск без учета символов 
:(
    Опции темы
z-END
Дата 14.9.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



можно ли организовать поиск, без учета символов? т.е.
в базе есть поле номер 8-123-456-78-90, пользователь вводит 81234567890 или 8 123 456 78 90  и находит соответствующую запись.?


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
rodnover
Дата 14.9.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Только если использовать UDF с возможностью замены по Regexp'ам. Например,

http://www.mysqludf.org/lib_mysqludf_preg/

Удалять в обоих случаях лишние символы и их сравнивать. Либо хранить в базе номера уже без лишних символов, а в строке введенной пользователем удалять лишние символы.

Или вот так, но это очень громоздко:

Код

select  replace(REPLACE('8-1-2 3-456-7890', '-', ''), ' ', '')


Это сообщение отредактировал(а) rodnover - 14.9.2011, 11:21
PM MAIL   Вверх
z-END
Дата 14.9.2011, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Цитата(rodnover @  14.9.2011,  12:02 Найти цитируемый пост)
 Либо хранить в базе номера уже без лишних символов, а в строке введенной пользователем удалять лишние символы.

с этим увы, не получится. по мимо телефонов, нужен поиск еще по артикулам.. например артикул  ABC-1222.01/165 должен находиться при запросах 
- ABC 122201 165
- ABC122201165 
т.е. вместо символа может быть любой символ в т.ч. и пробел, или ничего. 


Цитата(rodnover @  14.9.2011,  12:02 Найти цитируемый пост)
Только если использовать UDF 

печально.. это сторонняя библиотека, которую нужно отдельно подключать.


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
rodnover
Дата 14.9.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Тогда вырезанием подстрок или удалением лишних символов. :(
PM MAIL   Вверх
z-END
Дата 14.9.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



только что мысль в голову пришла: 
задача найти ABC-1222.01/165
пользователь вводит: ABC122201165 
выполняем запрос ...  LIKE  '%A%B%C%1%2%2%2%0%1%1%6%5%' (т.е. каждый символ экранируем %) тем самым мы включаем все символы... 
вот тока не могу понять, велика ли вероятность поймать ошибочное поле?


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
AndreyIQ
Дата 14.9.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 2
Всего: 8



Цитата(z-END @ 14.9.2011,  12:18)
только что мысль в голову пришла: 
задача найти ABC-1222.01/165
пользователь вводит: ABC122201165 
выполняем запрос ...  LIKE  '%A%B%C%1%2%2%2%0%1%1%6%5%' (т.е. каждый символ экранируем %) тем самым мы включаем все символы... 
вот тока не могу понять, велика ли вероятность поймать ошибочное поле?

Поймаешь вместо  ABC-1222.01/165: ABC-11222.01/165 и AABC-1222.01/165 и ABC-1222.101/165 и т.д.

Это сообщение отредактировал(а) AndreyIQ - 14.9.2011, 12:26
PM MAIL   Вверх
rodnover
Дата 14.9.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Цитата(z-END @  14.9.2011,  16:18 Найти цитируемый пост)
задача найти ABC-1222.01/165

Символы всегда в одинаковых местах же стоят?
Сделай тогда так:

пользователь вводит

ABC122201165, а в запрос отдавай 'ABC' + '-' + '1222' + '.' + ....
PM MAIL   Вверх
z-END
Дата 14.9.2011, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Цитата(rodnover @  14.9.2011,  13:36 Найти цитируемый пост)
Символы всегда в одинаковых местах же стоят?

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


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
AndreyIQ
Дата 14.9.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 2
Всего: 8



Цитата(z-END @ 14.9.2011,  13:28)
Цитата(rodnover @  14.9.2011,  13:36 Найти цитируемый пост)
Символы всегда в одинаковых местах же стоят?

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

ИМХО самый правильный вариант, предложенный Вам, rodnover'ом
Цитата(rodnover @ 14.9.2011,  11:02)

Удалять в обоих случаях лишние символы и их сравнивать. Либо хранить в базе номера уже без лишних символов, а в строке введенной пользователем удалять лишние символы.

PM MAIL   Вверх
z-END
Дата 14.9.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: нет
Всего: 102



Цитата(AndreyIQ @  14.9.2011,  14:38 Найти цитируемый пост)
ИМХО самый правильный вариант, предложенный Вам, rodnover'омЦитата(rodnover @ 14.9.2011,  11:02)Удалять в обоих случаях лишние символы и их сравнивать. Либо хранить в базе номера уже без лишних символов, а в строке введенной пользователем удалять лишние символы.


с данными приходящими от пользователя все понятно - вырезать регуляркой и все. а как быть с миллионом строк в базе данных? поштучно ВСЕ перебирать чтоли? 


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
AndreyIQ
Дата 14.9.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 2
Всего: 8



Цитата(z-END @ 14.9.2011,  14:26)
Цитата(AndreyIQ @  14.9.2011,  14:38 Найти цитируемый пост)
ИМХО самый правильный вариант, предложенный Вам, rodnover'омЦитата(rodnover @ 14.9.2011,  11:02)Удалять в обоих случаях лишние символы и их сравнивать. Либо хранить в базе номера уже без лишних символов, а в строке введенной пользователем удалять лишние символы.


с данными приходящими от пользователя все понятно - вырезать регуляркой и все. а как быть с миллионом строк в базе данных? поштучно ВСЕ перебирать чтоли?

Ранее предложенные варианты с UDF или 
Код

UPDATE table_name SET
field_name = REPLACE(REPLACE(REPLACE(field_name,'-',''),' ',''),'/','');

или написать хранимую процедуру

Это сообщение отредактировал(а) AndreyIQ - 14.9.2011, 14:57
PM MAIL   Вверх
rodnover
Дата 15.9.2011, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: нет
Всего: 10



Можно не update, а 
Код

select *
from TABLE
where replace(replace(replace(TABLE.FIELD, '-', ''), ' ', ''), '.','') = 'ABC1123'


Либо создать еще одно поле, в которое в триггере записывать строку без лишних символов. В итоге получится 2 варианта: один для поиска, другой для отображения.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.