SQL разбивает строку при первом появлении числа - PullRequest
2 голосов
/ 05 сентября 2011

В моей базе данных есть поле, содержащее улицу и номер дома. Я хочу разделить номер в новом столбце. Могу ли я сделать это, например,

INSERT INTO mytable(housenumber) VALUES SELECT ??? FROM mytable ?

1 Ответ

3 голосов
/ 05 сентября 2011

В простейшем решении используется функция подстроки с регулярными выражениями . Надеюсь, ваша версия PostgreSQL их поддерживает.

SELECT adres,
       substring(adres from '^.*?(?=[0-9]|$)') AS street,
       substring(adres from '[0-9].*$') AS housenum
  FROM mytable;
      adres      |  street   |    housenum
-----------------+--------------+-----------------
 some string 12  | some string  | 12
 another 2c      | another      | 2c
 no number       | no number    | 
 99 first number |              | 99 first number
 withnumber1 234 | withnumber   | 1 234
(5 rows)

Как указано в комментарии NullUserException , название улицы может содержать сам номер , который не следует считать номером дома. В этом случае я предполагаю, что «номер дома» может быть определен как подстрока, начинающаяся с цифры, перед которой ставится пробел.

Регулярные выражения в этом случае выглядят так:

SELECT adres,
       substring(adres from '^.*?(?=\\s[0-9]|$)') AS street,
       substring(adres from '\\s([0-9].*)$') AS housenum
  FROM mytable;

Примеры будут разбиты по-разному:

      adres      |    street       | housenum
-----------------+-----------------+-----------
 some string 12  | some string     | 12
 another 2c      | another         | 2c
 no number       | no number       | 
 99 first number | 99 first number | 
 withnumber1 234 | withnumber1     | 234
(5 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...