2

我有一个包含多语言字符串的表,如下所示:

type_id_fk  lang_id_fk  ui_text   
1           1           "Faktúra"
1           2           "Invoice"
2           1           "Dodací list"
2           2           "Bill of delivery"
3           1           "Objednávka"
3           2           "Order sheet"

我想要一个生成此结果的选择:

1;"Faktúra";"Invoice"
2;"Dodací list";"Bill of delivery"
3;"Objednávka";"Order sheet"

其中,1,2,3 来自type_id_fk。我尝试了 Group by,但没有成功。或者尝试过这样的事情:

SELECT (t_type.type_id as typeID) ||';'||(
    SELECT t_type_ml.type_name FROM t_type_ml WHERE t_type_ml.type_id_fk = typeID AND t_type_ml.language_id_fk = 1)||';'||(
    SELECT t_type_ml.type_name FROM t_type_ml WHERE t_type_ml.type_id_fk = typeID AND t_type_ml.language_id_fk = 2)||';'
FROM t_type;

但它甚至没有运行。我需要加入吗?感谢帮助

4

3 回答 3

2

或者,您可以旋转数据,例如:-

SELECT  TYPE_ID,
    MAX(CASE LANGUAGE_ID WHEN 1 THEN UI_TEXT ELSE NULL END) AS FRENCH,
    MAX(CASE LANGUAGE_ID WHEN 2 THEN UI_TEXT ELSE NULL END AS ENGLISH
FROM    TABLE_NAME
GROUP BY TYPE_ID
于 2012-09-13T13:19:12.313 回答
2
SELECT t1.type_id||';'||t1.type_name||';'||t2.type_name
FROM t_type t1 LEFT JOIN t_type t2 ON t1.type_id=t2.type_id AND t2.language_id_fk = 2
WHERE t1.language_id_fk = 1
于 2012-09-13T13:13:27.390 回答
1

使用聚合函数string_agg()

SELECT type_id_fk, string_agg(ui_text, ';' ORDER BY lang_id_fk)
FROM   t_type
GROUP  BY 1
ORDER  BY 1;

添加的ORDER BY lang_id_fk排序根据lang_id_fk聚合字符串内。
这适用于任何数量的语言,而不仅仅是两种语言的特殊情况。

或者,如果您实际上想要每行一个字符串:

SELECT type_id_fk::text || ';' 
       || COALESCE(string_agg(ui_text, ';' ORDER BY lang_id_fk), 'no text')
...

COALESCE()处理NULL值,如果有的话。

于 2012-09-13T16:24:22.783 回答