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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySql]Копирование с редактированием 
:(
    Опции темы
maddoc
Дата 5.5.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Суть вопроса. Есть таблица, там храняться номера телефонов. по ним нужно сделать поиск. Но телефоны написаны в разных форматах (как угодно 8-495 -1321231 или 8495123126 или 123123123 или моб.12312333, дом 1234566, вообщем как угодно).
Я пока остановился на том, что нужно создать новую таблицу, и при переносе чистить все кроме цифр. как такое реализовать?
у меня mysql.

Это сообщение отредактировал(а) maddoc - 5.5.2009, 17:35


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
Akina
Дата 5.5.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

SELECT TRIM ( BOTH 'перечень удаляемых символов - т.е. всё кроме цифр'
              FROM `Поле с номером телефона`
            ) as `Phone`

Правда, это уберёт только "левые" символы в начале и в конце. Серединку придётся дообрабатывать... 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maddoc
Дата 5.5.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а каким образом с серединкой бороться?


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
Akina
Дата 5.5.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



В общем пиши функцию...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maddoc
Дата 5.5.2009, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а как это сделать одельным запросом? в новой таблице?


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
bars80080
Дата 5.5.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 1
Всего: 315



имхо, для таких вариантов - ввести отдельное поле в ту же таблицу, куда копировать номер исключительно из цифр. при запросах insert вставлять уже готовый, по нему и искать. при создании поля один раз пробежаться по таблице и перекопировать скриптом старые номера в новом варианте
PM MAIL WWW   Вверх
DimW
Дата 5.5.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(maddoc @  5.5.2009,  17:59 Найти цитируемый пост)
а каким образом с серединкой бороться? 

в оракле есть функция translate
Код

SQL> select translate('101-1212-4545', '0123456789-', '0123456789') result from dual
  2  /
 
RESULT
-----------
10112124545


попробуйте поискать аналоги в mysql




Это сообщение отредактировал(а) DimW - 5.5.2009, 19:00
PM MAIL ICQ   Вверх
Zloxa
Дата 5.5.2009, 20:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(DimW @  5.5.2009,  18:59 Найти цитируемый пост)
в оракле есть функция translate

Для случая, показанного тобой, достаточно Replace(который, кстати и в mySql вроде есть) smile 

Лучше же, ИМХО транслейт зарядить катко так:
Код

select translate(val,'1234567890'||translate(val,'@1234567890','@'),'1234567890') transval
      ,val 
from(
  select
    '+7 (101) 1212-454' val
  from dual)

TRANSVAL          VAL               
----------------- ----------------- 
71011212454       +7 (101) 1212-454 

1 rows selected



maddoc, 
Если набор сорных символов заранее известен, мoжно обойтись каскадом реплейсов
Код

select replace(
         replace(
           replace(
              replace(
                replace(
                  val
                  ,')')
                ,'(')
              ,' ')
           ,'+')
         ,'-') transval
      ,val 
from(
  select
    '+7 (101) 1212-454' val
  from dual)

TRANSVAL          VAL               
----------------- ----------------- 
71011212454       +7 (101) 1212-454 

1 rows selected


Добавлено через 7 минут и 56 секунд
Цитата(maddoc @  5.5.2009,  17:34 Найти цитируемый пост)
по ним нужно сделать поиск

а поиск можно производить используя регекспы

Это сообщение отредактировал(а) Zloxa - 5.5.2009, 20:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 6.5.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(Zloxa @  5.5.2009,  20:35 Найти цитируемый пост)
Для случая, показанного тобой, достаточно Replace(который, кстати и в mySql вроде есть)  

для моего случая, да. какой случай у автора неизвестно, пример упростил для понимания.
PM MAIL ICQ   Вверх
maddoc
Дата 6.5.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
"Безвыходных положений не бывает" (с) Камасутра
PM MAIL   Вверх
Zloxa
Дата 6.5.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(maddoc @  6.5.2009,  09:32 Найти цитируемый пост)
наводку, как их применить. 

Наверняка дословно перевести на mySql не получится, потому лишь в качестве наводки:
Код

SQL> SQL> with t as (
  2   select '8-495 -1321231' phone from dual
  3   union all select '+7(495)132-12-31' phone from dual
  4   union all select '84951321231' phone from dual
  5   union all select '132 1231' phone from dual
  6   union all select 'дом 1234566' phone from dual
  7  )
  8  select t.*from t
  9  where regexp_like(phone,'^[\D^+]*(8|+7)?\D*(495)?\D*1\D*3\D*2\D*1\D*2\D*3\D*1\D*')
 10  ;
 
PHONE
----------------
8-495 -1321231
+7(495)132-12-31
84951321231
132 1231
 

Вольный первод регекспа:
^ начинаем поиск с начала строки
[\D^+]* - далее должна(может) встретиться "не цифра" или не плюс ноль или более раз
(8|+7)? - далее должна(может) встреиться восмерка или +7 ноль или один раз
\D* - далее должна(может) встретиться "не  цифра" ноль или более раз
(495)? далее должна(может) встериться подстрока 495 ноль или один раз
\D* - далее должна(может) встретиться "не  цифра" ноль или более раз
1 - далее должна встретиться еденица
\D* - далее должна(может) встретиться "не  цифра" ноль или более раз
3 - далее должна встретиться тройка 
\D* - далее должна(может) встретиться "не  цифра" ноль или более раз
2 - далее должна встретиться двойка
...
и т.д.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
DimW
Дата 6.5.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 4
Всего: 44



Цитата(maddoc @  6.5.2009,  09:32 Найти цитируемый пост)
склоняюсь к регекспам. но никогда их не использовал. 

maddoc, regexp это функция которая позвоняет использовать регулярные выражения. если вы сними знакомы то трудностей возникнуть не должно.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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