PostgreSQL中使用多分隔符(AND/OR)拼接字符串的实现方案(不使用||拼接符)
解决PostgreSQL中多分隔符拼接字符串的问题
嘿,这个需求我刚好碰到过类似的!要混合用AND和OR拼接分组后的shape值,还不能用PostgreSQL的||拼接运算符对吧?我给你几个实用的方案,保证能解决问题:
先准备示例数据
首先咱们先把你给的示例数据建表插进去,方便后续测试:
CREATE TABLE shapes ( id INT, shape VARCHAR(20) ); INSERT INTO shapes VALUES (1, 'square'), (1, 'circle'), (1, 'triangle'), (2, 'square'), (2, 'circle'), (2, 'triangle'), (2, 'rectangle');
方案一:精准匹配你要的示例结果
你的示例里每个ID的拼接规则不一样,我们可以给每个分组内的记录标记行号,然后根据行号和ID来指定对应的分隔符,同时用concat()代替||来拼接:
SELECT id AS "ID", string_agg( CASE rn WHEN 1 THEN shape WHEN 2 THEN CASE id WHEN 1 THEN concat(' AND ', shape) WHEN 2 THEN concat(' OR ', shape) END WHEN 3 THEN CASE id WHEN 1 THEN concat(' OR ', shape) WHEN 2 THEN concat(' AND ', shape) END WHEN 4 THEN concat(' AND ', shape) END, '' ) AS "Shape" FROM ( -- 给每个分组内的记录按shape排序并标记行号,你也可以换成插入顺序或其他规则 SELECT id, shape, row_number() OVER (PARTITION BY id ORDER BY shape) AS rn FROM shapes ) sub GROUP BY id ORDER BY id;
执行这个查询后,就能得到你想要的结果:
ID | Shape 1 | square AND circle OR triangle 2 | square OR circle AND triangle AND rectangle
方案二:通用多分隔符规则
如果你的需求是更通用的规则(比如前2个用AND,后面的都用OR),可以简化CASE逻辑:
SELECT id AS "ID", string_agg( CASE rn WHEN 1 THEN shape WHEN 2 THEN concat(' AND ', shape) ELSE concat(' OR ', shape) END, '' ) AS "Shape" FROM ( SELECT id, shape, row_number() OVER (PARTITION BY id ORDER BY shape) AS rn FROM shapes ) sub GROUP BY id ORDER BY id;
这个查询的结果会是:
ID | Shape 1 | square AND circle OR triangle 2 | square AND circle OR triangle OR rectangle
核心思路总结
- 先用
row_number()给每个分组内的记录标记行号,这样我们就能精准控制每个位置的分隔符; - 用
CASE语句根据行号(或其他自定义规则)给每个shape前面添加对应的分隔符,全程用concat()代替||满足你的要求; - 最后用
string_agg()把这些带分隔符的字符串用空字符串拼接起来,就得到了混合分隔符的结果。
内容的提问来源于stack exchange,提问作者harsh arora
相关产品推荐
相关产品推荐

