PostgreSQL能否无JOIN仅用CASE表达式基于列值生成新增列
问题解答
结论:不需要JOIN关联即可实现需求,但仅靠CASE表达式无法完成单行转多行的行数扩增,搭配PostgreSQL内置的数组解嵌函数即可全程在单表查询逻辑下完成目标输出。
实现方式1(推荐,PostgreSQL原生数组方案,无冗余逻辑)
利用PostgreSQL同层级UNNEST函数按位置并行解嵌等长数组的特性,搭配CASE做标记判断,全程无JOIN:
SELECT trial, start_date, end_date, UNNEST(ARRAY[start_date, end_date]) AS "Date[(start_end_date)]", CASE UNNEST(ARRAY[1, 2]) WHEN 1 THEN 'start' ELSE 'end' END AS marker_start_end FROM 你的表名;
运行后会自动把原始每行拆成2行,日期列和标记列严格按位置对应,不会出现错位。
实现方式2(通用SQL写法,无数据库特性依赖)
如果不想用数据库专属的数组函数,也可以用UNION ALL拼接两段单表查询,同样不需要JOIN:
SELECT trial, start_date, end_date, start_date AS "Date[(start_end_date)]", 'start' AS marker_start_end FROM 你的表名 UNION ALL SELECT trial, start_date, end_date, end_date AS "Date[(start_end_date)]", 'end' AS marker_start_end FROM 你的表名;
说明
- CASE表达式的作用仅为列值计算,本身不具备改变返回行数的能力,必须搭配行生成逻辑才能实现1行转2行的效果
- 上述两种方案都没有使用任何JOIN关联操作,查询效率远高于自关联写法
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

