SQL实现:如何从两列提取最值生成高低血压列?
解决两列提取最大值和最小值的问题
问题描述
现有如下数据表:
BP1 BP2 ----------------------------- 140 80 153 88 90 162 98 214 98 69
需要将数据整理为两列:BP_High(每行两列的最大值)和BP_Low(每行两列的最小值),预期输出:
BP_High BP_Low --------------------------------- 140 80 153 88 162 90 214 98 98 69
所有值均为整数类型
问题分析与修正
你尝试的第二种CASE WHEN语句逻辑是正确的,出现错误输出大概率是因为表名Table属于SQL关键字,需要用标识符引起来(不同数据库语法略有区别)。以下是修正后的写法:
正确的CASE WHEN写法
- MySQL/MariaDB:
SELECT CASE WHEN BP1 > BP2 THEN BP1 ELSE BP2 END AS BP_High, CASE WHEN BP1 > BP2 THEN BP2 ELSE BP1 END AS BP_Low FROM `Table`;
- SQL Server:
SELECT CASE WHEN BP1 > BP2 THEN BP1 ELSE BP2 END AS BP_High, CASE WHEN BP1 > BP2 THEN BP2 ELSE BP1 END AS BP_Low FROM [Table];
- PostgreSQL/Oracle:
SELECT CASE WHEN BP1 > BP2 THEN BP1 ELSE BP2 END AS BP_High, CASE WHEN BP1 > BP2 THEN BP2 ELSE BP1 END AS BP_Low FROM "Table";
更简洁的替代方法:使用内置函数
几乎所有主流SQL数据库都提供了直接取多列最大/最小值的内置函数,比CASE WHEN更简洁高效:
1. MySQL/MariaDB/PostgreSQL/Oracle(SQL Server 2022+)
使用GREATEST()取最大值,LEAST()取最小值:
SELECT GREATEST(BP1, BP2) AS BP_High, LEAST(BP1, BP2) AS BP_Low FROM `Table`; -- 根据数据库替换标识符格式
2. SQL Server 低版本(2022之前)
用IIF()简化逻辑:
SELECT IIF(BP1 > BP2, BP1, BP2) AS BP_High, IIF(BP1 > BP2, BP2, BP1) AS BP_Low FROM [Table];
内容的提问来源于stack exchange,提问作者KapSht
相关产品推荐
相关产品推荐

