如何使用' Case'来比较多列中的值,从而检索具有最大值的列名。语句
例如:有超过10列。
A B C D E Result
1 2 3 1 5 E
列E具有最高的no,在结果列中我应该得到' E'作为答案。
这里A B C D E结果是列。通过比较A,B,C,D,E的值,我应该使用Case表达式得到结果列中具有最大no的列名。
答案 0 :(得分:1)
SQL的大多数方言都支持greatest()
和least()
:
select greatest(a, b, c, d, e) as greatest,
least(a, b, c, d, e) as least
那些通常没有其他机制的人。例如,SQLite重载min()
和max()
:
select min(a, b, c, d, e) as greatest,
max(a, b, c, d, e) as least
或者,在SQL Server中,我会使用apply
:
select v.*
from t cross apply
(select max(val) as greatest, min(val) as least
from (values (a), (b), (c), (d), (e)) v(val)
) v;
答案 1 :(得分:0)
使用CASE?也许是这样的事情?
SQL> with test (a, b, c, d) as
2 (select 1, 2, 3, 1 from dual)
3 select
4 case when a >= b and a >= c and a >= d then a
5 when b >= a and b >= c and b >= d then b
6 when c >= a and c >= b and c >= d then c
7 when d >= a and d >= b and d >= c then d
8 end result
9 from test;
RESULT
----------
3
SQL>
答案 2 :(得分:-1)
不敢相信......典型的设计问题。很多令人头疼的事实是数据库设计者根本不应该触摸数据库。
您希望从不同列获取最大值:这意味着这些列中的数据具有相同的上下文。我们在这里比较苹果,橙子,桃子和香蕉!
由于您要比较具有相同上下文的数据,因此它们应该都在同一列中。让人们试图帮助你避免划伤他们的大脑。 pfff ...
我的解决方案有点野蛮......
create table jeez(
jeez_id serial primary key,
row_id integer,
row_value integer)
insert into jeez (row_id, row_value)
select TheTableWithNoName_id, column_a from TheTableWithNoName
union
select TheTableWithNoName_id, column_b from TheTableWithNoName
union
select TheTableWithNoName_id, column_c from TheTableWithNoName
union
select TheTableWithNoName_id, column_d from TheTableWithNoName
现在你可以这样做:
select row_id, max(row_value)
from jeez
group by 1
order by 1
原谅。