我为我的问题准备了一个简单的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)
是否可以巧妙地使用聚合函数来实现这一目标?