Postgresql如何连接字符串但仅当值不同时?
Postgresql how to concatenate strings but only when values are different?
我想创建一个聚合我的专栏的视图 "country"。我的 table 看起来像这样:
project_ref | country
----------------------
1 | Italy
1 | Italy
2 | France
2 | Italy
目前,我运行以下查询:
CREATE VIEW a AS
SELECT project_ref,
string_agg(country, ', ') AS country
FROM b GROUP BY project_ref ORDER BY project_num ASC;
结果我得到以下 table:
project_ref | country
----------------------------
1 | Italy, Italy
2 | France, Italy
有没有办法删除重复值 "Italy, Italy" 以便 "Italy" 只被提及一次?
我想要以下内容 table:
project_ref | country
---------------------------
1 | Italy
2 | France, Italy
但我找不到去那里的路...有什么想法吗?
我使用的是 PostgreSQL 9.4.5 版本。
非常感谢!
您可以使用子查询删除重复记录并用它们创建一个数组。如果要将国家/地区集合存储为以逗号分隔的文本,请使用函数 ARRAY_TO_STRING
,如下所示:
CREATE VIEW a AS
SELECT project_ref,
ARRAY_TO_STRING(ARRAY(SELECT DISTINCT country
FROM b q2
WHERE q1.project_ref = q2.project_ref),',') AS country
FROM b q1
GROUP BY project_ref
这是你的观点,没有重复:
db=# SELECT * FROM a;
project_ref | country
-------------+-----------------
1 | Italy
2 | France,Italy
(2 Zeilen)
这种方法的一个优点是您可以 运行 您的 DISTINCT
有多个列,方法是使用 DISTINCT ON (colmun1, column2, ...)
.
只需在string_agg
中添加distinct
:
string_agg(distinct country, ', ')
我想创建一个聚合我的专栏的视图 "country"。我的 table 看起来像这样:
project_ref | country
----------------------
1 | Italy
1 | Italy
2 | France
2 | Italy
目前,我运行以下查询:
CREATE VIEW a AS
SELECT project_ref,
string_agg(country, ', ') AS country
FROM b GROUP BY project_ref ORDER BY project_num ASC;
结果我得到以下 table:
project_ref | country
----------------------------
1 | Italy, Italy
2 | France, Italy
有没有办法删除重复值 "Italy, Italy" 以便 "Italy" 只被提及一次?
我想要以下内容 table:
project_ref | country
---------------------------
1 | Italy
2 | France, Italy
但我找不到去那里的路...有什么想法吗?
我使用的是 PostgreSQL 9.4.5 版本。
非常感谢!
您可以使用子查询删除重复记录并用它们创建一个数组。如果要将国家/地区集合存储为以逗号分隔的文本,请使用函数 ARRAY_TO_STRING
,如下所示:
CREATE VIEW a AS
SELECT project_ref,
ARRAY_TO_STRING(ARRAY(SELECT DISTINCT country
FROM b q2
WHERE q1.project_ref = q2.project_ref),',') AS country
FROM b q1
GROUP BY project_ref
这是你的观点,没有重复:
db=# SELECT * FROM a;
project_ref | country
-------------+-----------------
1 | Italy
2 | France,Italy
(2 Zeilen)
这种方法的一个优点是您可以 运行 您的 DISTINCT
有多个列,方法是使用 DISTINCT ON (colmun1, column2, ...)
.
只需在string_agg
中添加distinct
:
string_agg(distinct country, ', ')