数据来源: 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
列Id
、Part2B
、Part2T
和Part1
是国际各种标准中使用的代码, 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
此结构清楚地表明 Part2T
是 Part3
的子集,但 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/