我在转移"真实世界"时遇到了问题。数据到我的架构中。 它实际上是一个"项目"对于我的数据库课程,他们给了我们一张狗比赛结果表。该表有一个列,其中包含Dog的名称(其本身由实际名称和育种者的名称组成)以及有关Birthcountry,实际生活国家和出生年份的信息。 提交的示例是" Lillycette [AU 2012]"或者" Black Bear Lee [AU / AU 2013]"或" Lemon Ralph [IE / UK 1998]"。 我管理它以获取第一个单词并使用split_part将其保存在右栏中,如下所示:
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'[^ ]*\\ ( +)$') != '';
上面的代码执行没有错误但实际上什么也没做,因为SELECT语句只返回空字符串。
我花了3个多小时来理解这个常规表达式,但是当我看到它们时我仍觉得很愚蠢。
还有其他方法可以做到这一点。如果是这样,请给我一个提示。 如果不是我上面的表达有什么问题?
感谢您的帮助。
答案 0 :(得分:0)
您需要使用原子.
,它匹配捕获组内的任何单个字符:
E'[^ ]*\\ (.+)$'
答案 1 :(得分: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
像上面那样。