【问题标题】:Get every two rows from data table to result从数据表中获取每两行结果
【发布时间】:2012-09-13 13:04:26
【问题描述】:

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

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;

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

【问题讨论】:

  • 如果可以,您将从规范化数据库架构中受益匪浅。
  • 你需要的是这样的:postgres.cz/wiki/…@Dan,我不确定他的结构有什么不规范的地方。
  • @DavidFaber +1 感谢它有效!

标签: sql postgresql select rows


【解决方案1】:
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

【讨论】:

  • 这会起作用,但如果有两个以上的语言条目,则不会。
  • 那是真的......当两个翻译之一不存在时它甚至不起作用,我必须记住这一点,但现在还可以
【解决方案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

【讨论】:

    【解决方案3】:

    使用聚合函数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 值,如果有的话。

    【讨论】:

    • +1 谢谢,一切正常,我需要 postgresql 函数,但由于我不希望移植到其他数据库系统,现在可以了 :)
    猜你喜欢
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2014-11-03
    • 2017-07-19
    • 2015-11-09
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    相关资源
    最近更新 更多