我有一个包含多语言字符串的表格如下:
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;
但它甚至没有运行。我需要加入吗?谢谢你的帮助
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分: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
值,如果有的话。