Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > поиск без учета символов


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

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

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

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

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

Код

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

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

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


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

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

Автор: rodnover 14.9.2011, 12:10
Тогда вырезанием подстрок или удалением лишних символов. :(

Автор: 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%' (т.е. каждый символ экранируем %) тем самым мы включаем все символы... 
вот тока не могу понять, велика ли вероятность поймать ошибочное поле?

Автор: AndreyIQ 14.9.2011, 12:25
Цитата(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 и т.д.

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

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

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

ABC122201165, а в запрос отдавай 'ABC' + '-' + '1222' + '.' + ....

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

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

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

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

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

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

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


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

Автор: AndreyIQ 14.9.2011, 14:55
Цитата(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,'-',''),' ',''),'/','');

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

Автор: rodnover 15.9.2011, 06:27
Можно не update, а 
Код

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


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)