选择String的中间部分(如果存在)。的PostgreSQL

时间:2016-07-10 09:31:16

标签: sql postgresql

我在转移"真实世界"时遇到了问题。数据到我的架构中。 它实际上是一个"项目"对于我的数据库课程,他们给了我们一张狗比赛结果表。该表有一个列,其中包含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个多小时来理解这个常规表达式,但是当我看到它们时我仍觉得很愚蠢。

还有其他方法可以做到这一点。如果是这样,请给我一个提示。 如果不是我上面的表达有什么问题?

感谢您的帮助。

2 个答案:

答案 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

像上面那样。