PostgreSQL如何查询同一产品对应多个cod_1、cod_2编码
PostgreSQL多值产品查询解决方案
你可以直接使用以下SQL语句实现需求,适配你给出的表结构和输出要求:
1. 测试环境预置(可选,用于本地验证)
-- 建表 CREATE TABLE product_tab ( cod_1 INT, cod_2 INT, prod VARCHAR(10) ); -- 插入示例数据 INSERT INTO product_tab VALUES (10, 33, 'A'), (2, 78, 'B'), (5, 105, 'A'), (7, 34, 'D'), (3, NULL, 'D');
2. 核心查询语句
WITH prod_agg AS ( SELECT prod, -- 聚合拼接所有非空cod_1,按从大到小排序 STRING_AGG(cod_1::VARCHAR, ' and ' ORDER BY cod_1 DESC) AS cod1_vals, COUNT(cod_1) AS cod1_num, -- 聚合拼接所有非空cod_2,按从大到小排序 STRING_AGG(cod_2::VARCHAR, ' and ' ORDER BY cod_2 DESC) AS cod2_vals, COUNT(cod_2) AS cod2_num FROM product_tab GROUP BY prod -- 只保留至少一个字段有多个值的产品 HAVING COUNT(cod_1) > 1 OR COUNT(cod_2) > 1 ) SELECT CONCAT( prod, ' has cod_1 = ', cod1_vals, -- cod_2有多值时才拼接对应描述 CASE WHEN cod2_num > 1 THEN CONCAT(' ; ', prod, ' has code_2 = ', cod2_vals) ELSE '' END, ';' ) AS output_result FROM prod_agg;
3. 输出效果
执行后返回结果和你要求的格式完全匹配:
A has cod_1 = 10 and 5 ; A has code_2 = 33 and 105; D has cod_1 = 7 and 3;
关键逻辑说明
- 用CTE先按产品分组,通过
STRING_AGG聚合函数拼接同一产品下的所有字段值,支持自定义分隔符和排序规则 COUNT(字段名)会自动忽略NULL值,符合示例中D的cod_2为NULL不参与统计的需求- 外层用
CASE判断是否需要拼接cod_2的描述,避免单值产品输出冗余内容
内容的提问来源于stack exchange,提问作者pouchewar
相关产品推荐
相关产品推荐

