PostgreSQL复杂的JOIN或Subselect查询结构

时间:2014-11-11 14:13:10

标签: sql postgresql postgresql-9.3

我在Postgres中有以下表结构:

     Column      |          Type          
-----------------+------------------------
 alternatenameid | integer                
 geonameid       | integer                
 isolanguage     | character varying(7)   
 alternatename   | character varying(300) 
 ispreferredname | boolean                
 isshortname     | boolean                

为简单起见,我们说我们有以下数据:

 alternatenameid | geonameid | isolanguage |    alternatename      | ispreferredname | isshortname
-----------------+-----------+-------------+-----------------------+-----------------+------------
 2421691         |   1835841 | es          | Corea, República de   | t               |            
 1562679         |   1835841 | es          | Corea del Sur         |                 | t          
 1562677         |   1835841 | en          | South Korea           |                 | t          
 8103216         |   1835841 | en          | Korea, Republic of    |                 |            

该表存储了地名的翻译字符串,其中每个地名(在本例中为韩国)都有一个独特的地理位置(1835841)。每个地名都可能有不同语言的翻译,由isolanguage列定义,这些翻译的名称可以是首选名称(boolean ispreferredname),短名称(boolean isshortname),或者两者都不是(两个字段都是NULL)。我无法使用以下结构从此数据创建新表:

     Column      |          Type          
-----------------+------------------------
 id              | integer                
 geonameid       | integer                
 isolanguage     | character varying(7)   
 alternatename   | character varying(300) 
 preferredname   | character varying(300) 
 shortname       | character varying(300)

以下数据:

id     | geonameid | isolanguage |    alternatename      |    preferredname    | shortname
-------+-----------+-------------+-----------------------+---------------------+---------------
 (int) |   1835841 | es          |                       | Corea, República de | Corea del Sur
 (int) |   1835841 | en          | Korea, Republic of    |                     | South Korea

如果核心结构基于(DISTINCT geonameid,isolanguage),而preferredname和shortname包含ispreferredname和isshortname行的字符串,则如果不存在ispreferredname和isshortname,则alternatename包含相应的字符串。我不熟悉复杂的JOIN或Sub-SELECT子句,我将非常感谢你的帮助。

解决方案:

戈登指出,这可以通过条件汇总来实现:

SELECT geonameid, isolanguage,
       MAX(CASE WHEN ispreferredname IS TRUE OR isshortname IS TRUE THEN NULL
                ELSE alternatename
           END) AS alternatename,
       MAX(CASE WHEN ispreferredname IS TRUE THEN alternatename
           END) AS preferredname,
       MAX(CASE WHEN isshortname IS TRUE THEN alternatename
           END) AS shortname
FROM table t
GROUP BY geonameid, isolanguage;

1 个答案:

答案 0 :(得分:2)

我相信你可以通过条件聚合来做到这一点:

select geonameid, isolanguage,
       max(case when ispreferredname = t or isshortname = t then NULL
                else alternatename
           end) as alternatename,
       max(case when ispreferredname = t then alternatename
           end) as preferredname,
       max(case when isshortname = t then alternatename
           end) as shortname
from table t
group by geonameid, isolanguage;

第一个条件有点棘手,因为我不知道当标志不是t时标志会采用什么值。如果它们是空格,空字符串或NULL s。

,则应该有效