PostgreSQL:比较同一列但不同系列(行)中的字符串

时间:2019-05-29 14:00:39

标签: postgresql

我有一个使用子查询生成的简单表,该子查询应用了许多不同的过滤器。

  | project
1 | Hello
2 | Hello 2.0
3 | Ordinary Sheep
4 | Sheep

下一步是删除名称非常相似的项目(例如,如果一个项目具有相同的名称,但后跟一个2.0)。

在这种情况下,我需要查询从结果中删除Project 2.0。这个小问题比我预期的更具挑战性。

我最好的选择似乎是在这里正确地识别应该排除的项目,但是如果我反转操作,由于自我联接,最终会得到重复的数据。

SELECT 
    q1.name,
    q2.name
FROM subquery q1
JOIN subquery q2 ON q1.name LIKE q2.name || '%'
WHERE q1.id <> q2.id;

非常感谢您!

1 个答案:

答案 0 :(得分:1)

也许您可以匹配项目中第一个出现的数字并排除之后的所有内容。然后在其上应用RTRIMDISTINCT。但是,如果项目名称本身包含数字,则此方法将无效。

with s as 
( 
   --your query that you have inside sub-query
)
select DISTINCT RTRIM(regexp_replace(project, '^([^\d]+)\d.*$','\1')) from s;

DEMO