sql - 将同一个表中的多个列组合成 1 个更长的唯一列?

标签 sql postgresql database-schema postgresql-8.4

数据来源: http://www-01.sil.org/iso639-3/iso-639-3_20130520.tab

所以我有一个像这样的(从实际的缩写):

Part3   Part2B  Part2T  Part1   Scope   Type    Name    Comment 
aaa     NULL    NULL    NULL    I       L       Ghotuo  NULL    
aar     aar     aar     aa      I       L       Afar    NULL    
ach     ach     ach     NULL    I       L       Acoli   NULL    
ave     ave     ave     ae      I       A       Avestan NULL    
bod     tib     bod     bo      I       L       Tibetan NULL    
ces     cze     ces     cs      I       L       Czech   NULL    

IdPart2BPart2TPart1是国际各种标准中使用的代码, ISO 639 的所有部分。虽然这对于从 ISO 639-2(B)、ISO 639-2(T) 或 ISO 639-1 到 ISO 639-3 查找等效代码很有用,但当您不这样做时,它对于反向查找就不那么有用了。不知道代码属于哪。我希望有一个像这样的 View 结构(从上面的创建,为了清晰起见,将FALSE值留空):

Code    Part3   Part2B  Part2T  Part1   
aa                              TRUE    
aaa     TRUE                            
aar     TRUE    TRUE    TRUE            
ach     TRUE    TRUE    TRUE            
ae                              TRUE    
ave     TRUE    TRUE    TRUE            
bo                              TRUE    
bod     TRUE            TRUE            
ces     TRUE            TRUE            
cs                              TRUE    
cze             TRUE                    
tib             TRUE                    

此结构清楚地表明 Part2TPart3 的子集,但 Part2B 不是。因此,需要所有代码的单个 bool 值 *列* 来指定代码在 ISO 639 标准的哪一部分下有效。如果可以使用 View 将数据转换为我想要的结构,我们的目标也是不要重复数据或创建太多的来维护。


如何从表中创建此 View ,将多个列合并为 1 个唯一列? …或者 PostgreSQL 是否有可能?

最佳答案

请使用此:http://sqlfiddle.com/#!2/bcc34/12

SELECT DISTINCT PARTS.PART,
CASE WHEN PARTS.PART=T.PART3 THEN 'TRUE' ELSE NULL END AS PART3,
CASE WHEN PARTS.PART=T.PART2B THEN 'TRUE' ELSE NULL END AS PART2B,
CASE WHEN PARTS.PART=T.PART2T THEN 'TRUE' ELSE NULL END AS PART2T,
CASE WHEN PARTS.PART=T.PART1 THEN 'TRUE' ELSE NULL END AS PART1
 FROM 
(
SELECT
Part3,   
 Part2B, 
 Part2T, 
 Part1,  
 Scope,  
 Type,  
 Name,  
 Comment
FROM 
TEST_ISO ) T
JOIN 
(
SELECT PART3  AS PART FROM TEST_ISO
UNION
SELECT PART2B FROM TEST_ISO
UNION 
SELECT PART2T FROM TEST_ISO
UNION
SELECT PART1 FROM TEST_ISO) PARTS
ON T.PART3=PARTS.PART
OR T.PART2B=PARTS.PART
OR T.PART2T=PARTS.PART
OR T.PART1=PARTS.PART

如果您不需要 NULL,可以将 ELSE NULL 更改为 ELSE ''

这是我的结果:

PART    PART3   PART2B  PART2T  PART1
aaa     TRUE    (null)  (null)  (null)
aar     TRUE    TRUE    TRUE    (null)
ach     TRUE    TRUE    TRUE    (null)
ave     TRUE    TRUE    TRUE    (null)
bod     TRUE    (null)  TRUE    (null)
ces     TRUE    (null)  TRUE    (null)
tib     (null)  TRUE    (null)  (null)
cze     (null)  TRUE    (null)  (null)
aa      (null)  (null)  (null)  TRUE
ae      (null)  (null)  (null)  TRUE
bo      (null)  (null)  (null)  TRUE
cs      (null)  (null)  (null)  TRUE

关于sql - 将同一个表中的多个列组合成 1 个更长的唯一列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16991750/

相关文章:

sql - 按第 2 列排序,按第 1 列分组

mysql - 如何基于成对的列(它们本身是 SELECT 的结果)选择数据?

sql - Postgresql 按日期排序但随机

python - Django ORM - 通过过滤的外键关系查询集顺序

mysql - 与自身的多对多关系

Sql Select top 2, bottom 2 and 6 随机记录

MySQL 使用表 JOIN 更改数据集..我所问的可能吗?

sql - Postgresql 枢轴?交叉表?

mysql - 如何构建需要复杂连接的 Sequelize.js 架构?

sql - 为分区数据定义 Impala 表架构