SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.05.2008 13:23:08

viktorrrrrr
Участник
Зарегистрирован: 14.05.2008
Сообщений: 12

вопрос

вопрос состоит в том что возможно ли отделить название и номер приблизительно таk

____________________________________
n_id  | Strasse          | o_str          | o_hnr  |
--------------------------------------------------|-
   1   | Moskowstr. 25| Moskowstr.  |   25    |

Неактивен

 

#2 15.05.2008 16:23:14

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: вопрос

Средствами MySQL можно подстроку фиксированной длины типа SELECT SUBSTR(Strasse, 10):
http://dev.mysql.com/doc/refman/5.1-mar … _substring

Если нужно что-то более сложное, то придется использовать какой-нибудь клиент с поддержкой регулярных выражений Perl.

Неактивен

 

#3 15.05.2008 17:00:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: вопрос

Пробел можно без регулярных выражений найти в строке http://dev.mysql.com/doc/refman/5.0/en/ … ion_locate

Неактивен

 

#4 15.05.2008 17:58:45

viktorrrrrr
Участник
Зарегистрирован: 14.05.2008
Сообщений: 12

Re: вопрос

спасибо но это немного другое у мея есть талица в базе
5000 записей
____________________________________
n_id  | Strasse          | o_str          | o_hnr  |
-------------------------------------------------|-
   1   | Moskowstr. 25|                   |          |

и нужно разделить эти два значения в
____________________________________
n_id  | Strasse          | o_str          | o_hnr  |
--------------------------------------------------|-
   1   | Moskowstr. 25| Moskowstr.  |   25    |

я думал лучше попробовать в  Exel и импортровать в MySQL но немогу найти формулу для Exel
Danke !

Неактивен

 

#5 16.05.2008 00:15:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: вопрос

Самое то. Насколько я понимаю вам нужно разделить содержимое поля Strasse по пробелу и занести результат в новые поля. С помощью функции locate() вы определяете позицию пробела.


mysql> set @a = 'Moskowstr. 25';

mysql> select locate(' ', @a);
+-----------------+
| locate(' ', @a) |
+-----------------+
|              11 |
+-----------------+
 

Спомощью функции substring() вырезаете подстроку.

mysql> select substring(@a, 1, locate(' ', @a));
+-----------------------------------+
| substring(@a, 1, locate(' ', @a)) |
+-----------------------------------+
| Moskowstr.                        |
+-----------------------------------+


mysql> select substr(@a, locate(' ', @a));
+-----------------------------+
| substr(@a, locate(' ', @a)) |
+-----------------------------+
|  25                         |
+-----------------------------+
 

Чтобы обновить всю таблицу:

UPDATE table_name SET o_str = substring(Strasse, 1, locate(' ', Strasse)), o_hnr = substring(Strasse, locate(' ', Strasse));

Отредактированно vasya (16.05.2008 00:21:33)

Неактивен

 

#6 16.05.2008 11:12:46

viktorrrrrr
Участник
Зарегистрирован: 14.05.2008
Сообщений: 12

Re: вопрос

das war Supper vielen Dank!!!!!!!!!!!!!!!!


но есть небольшая проблема название может быть разделено пробелом  и тогда получается
________________________________________________
n_id  | Strasse                | o_str    |         o_hnr              |
------------------------------------------------------------------ |-
   1   | Alte Moskowstr. 25|Alte       |  Moskowstr. 25         |

Отредактированно viktorrrrrr (16.05.2008 11:36:44)

Неактивен

 

#7 16.05.2008 16:45:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: вопрос

Если пробел может быть только в названии (неважно сколько раз), то для преодоления этой сложности можно использовать функцию reverse(). Дело в том, что locate() определяет только первое вхождение подстроки.


mysql> set @a = 'Alte Moskowstr. 25';

mysql> select reverse(substring(reverse(@a), 1, locate(' ', reverse(@a))));
+--------------------------------------------------------------+
| reverse(substring(reverse(@a), 1, locate(' ', reverse(@a)))) |
+--------------------------------------------------------------+
|  25                                                          |
+--------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> select reverse(substring(reverse(@a), locate(' ', reverse(@a))));
+-----------------------------------------------------------+
| reverse(substring(reverse(@a), locate(' ', reverse(@a)))) |
+-----------------------------------------------------------+
| Alte Moskowstr.                                           |
+-----------------------------------------------------------+

 

Неактивен

 

#8 17.05.2008 13:12:34

viktorrrrrr
Участник
Зарегистрирован: 14.05.2008
Сообщений: 12

Re: вопрос

огромное спасибо
weiter so !!!!!!!!!!!!!!!!!!!

Неактивен

 

#9 21.05.2008 15:06:22

viktorrrrrr
Участник
Зарегистрирован: 14.05.2008
Сообщений: 12

Re: вопрос

возможно сделать так чтобы LOCATE искал не пробел а первую цифру в диапазоне [ 0......9]
потому что если нет пробела между названием и цифрой то роисходит следующее
___________________________________________________
n_id  | Strasse                | o_str    |         o_hnr                    |
-----------------------------------------------------------------------|
   1   | Alte Moskowstr.25   |Alte                 |  Moskowstr.25   |
2      | Moskowstr.8           |    --                |   --                   |
3      |Alte Moskowstr Nr.2 |Alte Moskowstr |     Nr.2              |

Отредактированно viktorrrrrr (21.05.2008 16:38:49)

Неактивен

 

#10 21.05.2008 21:00:26

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 845

Re: вопрос

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

Неактивен

 

#11 21.05.2008 22:05:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: вопрос

Можно написать многократно вложенный IF в запросе, но это действительно будет громоздко. Зато одним запросом, если в скобках не запутаетесьsmile

IF имеет 3 аргумента - условие, значение в случае истинности условия и значение в случае ложности условия.


(none) > select if(2>3,'да','нет');
+--------------------+
| if(2>3,'да','нет') |
+--------------------+
| нет                |
+--------------------+
 


В Вашем случае конструкция будет посложнее

if(locate('1',Strasse),locate('1',Strasse),if(locate('2',Strasse),locate('2',Strasse),if(...)));
 
и так до 9

Неактивен

 

#12 22.05.2008 12:15:00

viktorrrrrr
Участник
Зарегистрирован: 14.05.2008
Сообщений: 12

Re: вопрос

должно получится что то такое ?

set @a = 'Alte Banhofstr.25';

select reverse(substring(reverse(@a), 1, if(locate('1', reverse(@a), locate('1',reverse(@a)),
if(locate('2', reverse(@a), locate('2',reverse(@a)),
if(locate('3', reverse(@a), locate('3',reverse(@a)),
if(locate('4', reverse(@a), locate('4',reverse(@a)),
if(locate('5', reverse(@a), locate('5',reverse(@a)),
if(locate('6', reverse(@a), locate('6',reverse(@a)),
if(locate('7', reverse(@a), locate('7',reverse(@a)),
if(locate('8', reverse(@a), locate('8',reverse(@a)),
if(locate('9', reverse(@a), locate('9',reverse(@a)))))))))))));


+--------------------------------------------------------------+
| REVERSE(SUBSTRING(REVERSE(@a), 1, LOCATE(' ', REVERSE(@a)))) |
+--------------------------------------------------------------+
|  25                                                          |
+--------------------------------------------------------------+
1 row IN SET (0.01 sec)



select reverse(substring(reverse(@a),  if(locate('1', reverse(@a), locate('1',reverse(@a)),
if(locate('2', reverse(@a), locate('2',reverse(@a)),
if(locate('3', reverse(@a), locate('3',reverse(@a)),
if(locate('4', reverse(@a), locate('4',reverse(@a)),
if(locate('5', reverse(@a), locate('5',reverse(@a)),
if(locate('6', reverse(@a), locate('6',reverse(@a)),
if(locate('7', reverse(@a), locate('7',reverse(@a)),
if(locate('8', reverse(@a), locate('8',reverse(@a)),
if(locate('9', reverse(@a), locate('9',reverse(@a)))))))))))));


mysql> SELECT REVERSE(SUBSTRING(REVERSE(@a), LOCATE(' ', REVERSE(@a))));
+-----------------------------------------------------------+
| REVERSE(SUBSTRING(REVERSE(@a), LOCATE(' ', REVERSE(@a)))) |
+-----------------------------------------------------------+
| Alte Moskowstr.                                           |
+-----------------------------------------------------------+


update table_name set o_str = 
reverse(substring(reverse(strasse), 1, if(locate('1', reverse(strasse), locate('1',reverse(strasse)),
if(locate('2', reverse(strasse), locate('2',reverse(strasse)),
if(locate('3', reverse(strasse), locate('3',reverse(strasse)),
if(locate('4', reverse(strasse), locate('4',reverse(strasse)),
if(locate('5', reverse(strasse), locate('5',reverse(strasse)),
if(locate('6', reverse(strasse), locate('6',reverse(strasse)),
if(locate('7', reverse(strasse), locate('7',reverse(strasse)),
if(locate('8', reverse(strasse), locate('8',reverse(strasse)),
if(locate('9', reverse(strasse), locate('9',reverse(strasse))))))))))))),
o_hnr =
reverse(substring(reverse(strasse),  if(locate('1', reverse(strasse), locate('1',reverse(strasse)),
if(locate('2', reverse(strasse), locate('2',reverse(strasse)),
if(locate('3', reverse(strasse), locate('3',reverse(strasse)),
if(locate('4', reverse(strasse), locate('4',reverse(strasse)),
if(locate('5', reverse(strasse), locate('5',reverse(strasse)),
if(locate('6', reverse(strasse), locate('6',reverse(strasse)),
if(locate('7', reverse(strasse), locate('7',reverse(strasse)),
if(locate('8', reverse(strasse), locate('8',reverse(strasse)),
if(locate('9', reverse(strasse), locate('9',reverse(strasse)))))))))))));

Отредактированно viktorrrrrr (23.05.2008 11:00:29)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson