数据来源: 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-3的ISO 639-1查找等效代码,但是当你穿上它时反向查找它并不是那么有用不知道代码属于哪个列。我希望有一个视图这样的结构(从上面的表创建,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
不是。因此, boolean * columns *需要所有代码的单个列,以指定代码在其下有效的ISO 639标准的哪个部分。如果可以使用视图将数据转换为我想要的结构,那么目标也是不重复数据或创建太多表来维护。
如何从表格创建此视图,将多列合并为1个唯一列? ......或者甚至可以使用PostgreSQL吗?
答案 0 :(得分:2)
请使用此: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