2016-07-10 1 views
0

"실제"데이터를 내 스키마로 옮기는 데 문제가 있습니다. 사실 그것은 데이터베이스 코스의 "프로젝트"이며 개 경주 결과가 포함 된 ab 테이블을 제공했습니다. 이 표에는 개 이름 (실제 이름과 육종가 이름으로 구성된 Dog 이름)과 생년월일, 실제 생년월일 및 출생 연도에 대한 정보가 포함 된 열이 있습니다. 사례는 "Lillycette [AU 2012]"또는 "Black Bear Lee [AU/AU 2013]"또는 "Lemon Ralph [IE/UK 1998]"입니다.문자열의 중간 부분이 있으면 선택합니다. Postgresql

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

tblimport 내가 CSV 파일에서 데이터를 덤프 테이블입니다 : 나는 첫 번째 단어를 얻을이 같은 split_part와 오른쪽 열에으로 저장을 관리했습니다. 정상적으로 작동합니다. 때때로 두 번째 부분이 없기 때문에 때로는 두 번째 부분이 두 단어로 이루어지기 때문에 이름의 두 번째 부분에 액세스하는 데 실패합니다.

그리고 여기가 지금 막 붙어 있습니다. 나는 문자열과 정규 표현식을 시도 :

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

위의 코드는 오류없이 실행되지만 SELECT 문이 그냥 빈 문자열을 제공하기 때문에 실제로는 아무것도하지 않습니다.

이 정규 표현식을 약간 이해하는 데 3 시간이 걸렸지 만, 나는 그것을 볼 때 여전히 어리 석다.

다른 방법이 있습니까? 그렇다면 그냥 힌트를주세요. 위의 식에 무엇이 잘못 되었습니까?

도움 주셔서 감사합니다. 위의 같은

E'[^ ]*\\ (.+)$' 

답변

0

당신은 캡처 그룹 내부의 단일 문자와 일치 원자 .을 사용해야합니다.

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 

뭔가 :

관련 문제