我有一个表格,其中包含几种语言的街道名称:
streetName(addressId uuid, languageCode text, name text);使用值:
addressid |languagecode |name |
-------------------------------------|-------------|----------------|
e5c8c25c-f21e-47df-9172-7f3c7e52d669 |cz |streetName_1_cz |
e5c8c25c-f21e-47df-9172-7f3c7e52d669 |en |streetName_1_en |
e5c8c25c-f21e-47df-9172-7f3c7e52d669 |fi |streetName_1_fi |
e5c8c25c-f21e-47df-9172-7f3c7e52d669 |sv |streetName_1_sv |
bff096cc-4d4d-4b2e-aac2-bdc6ab659a72 |fi |streetName_2_fi |
bff096cc-4d4d-4b2e-aac2-bdc6ab659a72 |cz |streetName_2_cz |并且需要将cz,fi,en中的街道名称转换为列。(正是这三种语言,即使表中有更多的语言,也可能会发生,这三种语言中的一些语言的值就会丢失)。
因此,预期的结果是:
addressid |streetNameCz |streetNameEn |streetNameFi |
-------------------------------------|----------------|----------------|----------------|
e5c8c25c-f21e-47df-9172-7f3c7e52d669 |streetName_1_cz |streetName_1_en |streetName_1_fi |
bff096cc-4d4d-4b2e-aac2-bdc6ab659a72 |streetName_2_cz | |streetName_2_fi |该怎么做呢?我尝试使用交叉表,但它不能正常工作,因为某些语言缺少值,所以我得到了如下结果:
addressid |streetNameCz |streetNameEn |streetNameFi |
-------------------------------------|----------------|----------------|----------------|
e5c8c25c-f21e-47df-9172-7f3c7e52d669 |streetName_1_cz |streetName_1_en |streetName_1_fi |
bff096cc-4d4d-4b2e-aac2-bdc6ab659a72 |streetName_2_cz |streetName_2_fi | |这是错误的:-(。
这是我使用的select:
SELECT *
FROM crosstab(
'select
"addressid"::uuid as rowid,
languagecode::text as attribute,
name::text as value
from streetName
where languageCode in (''cz'', ''en'', ''fi'')
order by 1, 2')
AS ct(row_name uuid, "streetNameCz" text, "streetNameEn" text, "streetNameFi" text);谢谢你的建议。
兰格。
发布于 2018-04-10 21:23:38
如果你不想使用交叉表,你可以简单地做聚合:
SELECT addressid,
MAX( CASE WHEN languagecode = 'cz' THEN name END ) as lng_cz,
MAX( CASE WHEN languagecode = 'en' THEN name END ) as lng_en,
MAX( CASE WHEN languagecode = 'fi' THEN name END ) as lng_fi
FROM YourTable
GROUP BY addressidhttps://stackoverflow.com/questions/49754498
复制相似问题