2016-07-10 2 views
0

У меня возникла проблема с переносом данных «реального мира» в мою схему. Это на самом деле «проект» для моего курса базы данных, и они дали нам таблицу с результатами поиска собак. В этой таблице есть столбец, в котором содержится имя собаки (которая сама состоит из имени актуала и имени селекционера) и информации о родной стране, реальной жизни и году рождения. Пример: «Lillycette [AU 2012]» или «Black Bear Lee [AU/AU 2013]» или «Lemon Ralph [IE/UK 1998]». мне удалось его выйти первое слово и сохранить его в правой колонке с split_part, как это:SELECT средняя часть строки, если она существует. Postgresql

INSERT INTO tblHund (rufname) 
SELECT 
    split_part(name, ' ', 1) AS rufname, 
FROM tblimport; 

tblimport представляет собой таблицу, где я свалил данные из файла CSV. Это работает так, как должно. Доступ к второй части имени с этим невозможен, потому что иногда нет второй части, а иногда и там вторая часть состоит из двух слов.

И вот где як застрял прямо сейчас. Я пробовал с подстроки и регулярными выражениями:

INSERT INTO tblZwinger (Name) 
SELECT 
    substring(vatertier from E'[^ ]*\\ (+)$')AS Name 
FROM tblimport 
WHERE substring(vatertier from E'[^ ]*\\ (+)$') != ''; 

Приведенный выше код выполняется без ошибок, но на самом деле ничего не делает, потому что ЗЕЬЕСТ просто дать пустые строки обратно.

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

Есть ли другой способ сделать это. Если так, просто дайте мне подсказку. Если нет, то что не так с моим выражением выше?

Благодарим за помощь.

ответ

0

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

E'[^ ]*\\ (.+)$' 
0
SELECT 
    tblimport.*, 
    ti.parts[1] as f1, 
    ti.parts[2] as f2, -- It should be the "middle part" 
    ti.parts[3] as f3 
FROM 
    tblimport, 
    regexp_matches(tblimport.vatertier, '([^\s]+)\s*(.*)\s+\[(.*)\]') as ti(parts) 
WHERE 
    nullif(ti.parts[2], '') is not null 

Что-то вроде выше.

Смежные вопросы