Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 将同一表中的多个列合并为一个更长的唯一列?_Sql_Postgresql_Database Schema_Postgresql 8.4 - Fatal编程技术网

Sql 将同一表中的多个列合并为一个更长的唯一列?

Sql 将同一表中的多个列合并为一个更长的唯一列?,sql,postgresql,database-schema,postgresql-8.4,Sql,Postgresql,Database Schema,Postgresql 8.4,数据源: 我有一个这样的表(从实际表中缩写): 列Id、Part2B、Part2T和Part1是各种国际标准中使用的代码,它们都是标准的一部分。虽然这对于从ISO 639-2(B)、ISO 639-2(T)或ISO 639-3的ISO 639-1中查找等效代码很好,但当您不知道代码属于哪列时,它对于反向查找并不太有用。我更喜欢这样的视图结构(从上表创建,带有FALSE值,为了清晰起见,只需将值留空): 这个结构清楚地表明Part2T是Part3的子集,但Part2B不是。因此,需要一列包含所有代

数据源:

我有一个这样的表(从实际表中缩写):

Id
Part2B
Part2T
Part1
是各种国际标准中使用的代码,它们都是标准的一部分。虽然这对于从ISO 639-2(B)、ISO 639-2(T)或ISO 639-3的ISO 639-1中查找等效代码很好,但当您不知道代码属于哪列时,它对于反向查找并不太有用。我更喜欢这样的视图结构(从上表创建,带有
FALSE
值,为了清晰起见,只需将值留空):

这个结构清楚地表明
Part2T
Part3
的子集,但
Part2B
不是。因此,需要一列包含所有代码的布尔*列*来指定代码在ISO 639标准的哪个部分下有效。如果可以使用视图将数据转换为我想要的结构,那么目标也是不要复制数据或创建太多的表来维护


如何从表中创建此视图,将多个列合并为一个唯一的列…或者PostgreSQL也可以吗?

请使用以下选项:

如果不需要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

标准化方法更有用。如果你不知道这是什么意思,我听说过《为凡人设计数据库》这本书的好东西。@DanBracuk:换句话说,我应该通过编程创建一个表,将任意代码映射到ISO 639提供的表的Part3列?这是一个很好的工具!您的代码得到了与我在Microsoft Excel中手动创建的表完全相同的表,一直到最后一行。很高兴知道它工作正常。非常感谢。顺便说一句,SQLFIDLE可以帮助您模拟您的环境。当你们将来问问题的时候,你们可以用它来快速、简单地得到答案。做得很好。我认为如果您使用一个通用的表表达式,它的可读性会更好一些,但这会阻止Pg向下推过滤条件,所以它的效率可能会更低。
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                    
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
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