Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Преобразование строки в набор цифр / 7 сообщений из 7, страница 1 из 1
03.10.2014, 11:34:52
    #38765791
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
Помогите, пожалуйста, с запросом типа:
Код: sql
1.
'SELECT id FROM data WHERE ocr_phone=:p'


Поле "ocr_phone" типа tinytext может содержать строки вида:

'8-8652-72-85-17, ( 8652 )72-85-17 , 7-8652-72-85-17 '
'72-85-17'
'8-962-445-87-82 , ( 962 ) 758-74-85'
и т.п.,

т.е. распознанные номера телефонов в разном формате. А параметр :p всегда строка вида '9624458782' или '728517', т.е. номер телефона в виде одних цифр, сотовые без +7/8, городские - без кода.
Как выбрать id записей поле "ocr_phone" которых содержит параметр?

PS подозреваю, что поможет оператор REGEXP, но не знаю как его применить в данном случае...
...
Рейтинг: 0 / 0
03.10.2014, 13:56:33
    #38766090
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
Используя пакет Replace-ов (или пользовательскую функцию), удаляешь из ocr_phone все разделители, кроме запятой, а потом тупо INSTR().

Но правильнее - нормализовать данные.
...
Рейтинг: 0 / 0
03.10.2014, 15:29:58
    #38766218
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
Пока решил так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE FUNCTION `digits`(`str` char(255)) RETURNS char(255)
BEGIN
  DECLARE i, len SMALLINT DEFAULT 1; 
  DECLARE ret CHAR(255) DEFAULT ''; 
  DECLARE c CHAR(1); 
  SET len = CHAR_LENGTH( str ); 
  REPEAT 
    BEGIN 
      SET c = MID( str, i, 1 ); 
      IF c BETWEEN '0' AND '9' THEN  
        SET ret=CONCAT(ret,c); 
      END IF; 
      SET i = i + 1; 
    END; 
  UNTIL i > len END REPEAT;
  RETURN ret;
END;

SELECT id FROM data WHERE INSTR(digits(ocr_phones), :p)>0



Если не касаться вопроса нормализации, это корректное решение?
...
Рейтинг: 0 / 0
03.10.2014, 15:41:29
    #38766239
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
LiYing,

1) Вместо char используйте varchar. Да и лимит длины можно взять побольше.
2) Запятые вы тоже уничтожите.
...
Рейтинг: 0 / 0
03.10.2014, 15:48:44
    #38766263
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
miksoft,

1) Замена CHAR на VARCHAR ускорит выполнение функции? Макс.длина поля "ocr_phone" типа tinytext=255.
2) Запятые в плане задачи не важны, главное - факт нахождения подстроки, передаваемой в параметре, в строке поля "ocr_phone".
...
Рейтинг: 0 / 0
03.10.2014, 15:53:59
    #38766276
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
LiYing,

1) Скорее всего - да.

2) Тогда вы рискуете в качестве подстроки найти хвост одного номера и начало следующего.
...
Рейтинг: 0 / 0
03.10.2014, 15:58:48
    #38766288
LiYing
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование строки в набор цифр
miksoft,

1) Спасибо, исправлю.
2) Хм, верно, обдумаю. Хотя, вероятность такого в контексте задачи --> 0 :)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Преобразование строки в набор цифр / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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