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に従ってソートされます。 これは、2つの特殊なケースだけでなく、任意の数の言語で機能します。lang_id_fk

または、実際に行ごとに1つの文字列が必要な場合は、次のようにします。

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 に答える