【问题标题】:Constructing a string out of several records with 2 columns用 2 列从多条记录中构造一个字符串
【发布时间】:2018-08-07 03:57:40
【问题描述】:

我为我的问题准备了一个简单的SQL Fiddle -

在一个用 Pl/pgSQL 为 PostgreSQL 10.2 编写的文字游戏中,玩家的动作存储在表中:

CREATE TABLE words_scores (
        mid     bigint  NOT NULL REFERENCES words_moves ON DELETE CASCADE,
        gid     integer NOT NULL REFERENCES words_games ON DELETE CASCADE,
        uid     integer NOT NULL REFERENCES words_users ON DELETE CASCADE,
        word    text    NOT NULL CHECK(word ~ '^[A-Z]{2,}$'),
        score   integer NOT NULL CHECK(score >= 0)
);

这里填充了一些测试数据:

INSERT INTO words_scores (mid, gid, uid, word, score) VALUES
   (230, 209, 7, 'XY',  5),
   (230, 209, 7, 'XYZ', 15),
   (230, 209, 7, 'XAB', 13);

在一个存储函数中,我需要生成一个字符串,该字符串将包含玩家在某个动作中播放的所有单词。

这接近我需要的并返回XY, XYZ, XAB

SELECT STRING_AGG(word, ', ') FROM words_scores WHERE mid=230;

但是我还需要将每个单词的分数放在括号中,如下所示:

XY (5), XYZ (15), XAB (13)

是否可以巧妙地使用Aggregate Functions 来实现这一目标?

【问题讨论】:

    标签: postgresql plpgsql stored-functions string-aggregation postgresql-10


    【解决方案1】:

    在聚合之前使用 FORMAT(如manual 中所述)格式化您的字符串:

    SELECT STRING_AGG(FORMAT('%s (%s)', word, score), ', ') FROM words_scores WHERE mid=230;
    

    这是updated SQL Fiddle

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2020-06-29
      • 2012-01-22
      • 2018-10-13
      • 1970-01-01
      相关资源
      最近更新 更多