Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL复杂联接或子选择查询结构_Sql_Postgresql_Postgresql 9.3 - Fatal编程技术网

PostgreSQL复杂联接或子选择查询结构

PostgreSQL复杂联接或子选择查询结构,sql,postgresql,postgresql-9.3,Sql,Postgresql,Postgresql 9.3,我在Postgres中有以下表格结构: Column | Type -----------------+------------------------ alternatenameid | integer geonameid | integer isolanguage | character varying(7) alternatename

我在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    |                 |            
id     | geonameid | isolanguage |    alternatename      |    preferredname    | shortname
-------+-----------+-------------+-----------------------+---------------------+---------------
 (int) |   1835841 | es          |                       | Corea, República de | Corea del Sur
 (int) |   1835841 | en          | Korea, Republic of    |                     | South Korea
该表存储了地名的翻译字符串,其中每个地名(本例中为韩国)都有一个唯一的地理名称ID(1835841)。每个地名可能有不同语言的翻译,由Isolague列定义,这些翻译的名称可以是首选名称(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)
以及以下数据:

 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    |                 |            
id     | geonameid | isolanguage |    alternatename      |    preferredname    | shortname
-------+-----------+-------------+-----------------------+---------------------+---------------
 (int) |   1835841 | es          |                       | Corea, República de | Corea del Sur
 (int) |   1835841 | en          | Korea, Republic of    |                     | South Korea
其中,核心结构基于(不同的geonameid、Isolaguage),preferredname和shortname包含ispreferredname和isshortname行的字符串,如果ispreferredname和isshortname不存在,则alternatename包含相应的字符串。我不精通复杂的JOIN或Sub SELECT子句,我将感谢您的帮助

解决方案: 正如Gordon指出的,这可以通过条件聚合实现:

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;
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;


我相信您可以通过条件聚合实现这一点:

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;
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,则应使用此选项。

ispreferredname和isshortname是布尔字段,当值为TRUE时,psql将其显示为t。我只需要将=t比较改为TRUE,就可以工作了。非常感谢,戈登!