Oracle SQL-从查询中选择所有最大列值

时间:2020-01-16 12:00:52

标签: sql oracle oracle11g

假设这是我的桌子:

 Name    |  Surname      | Serial no.  | Price
-----------------------------------------------
 John    |  Smith        | A12444dW33  | 1,234 
 Paul    |  Harrison     | D2344fGGfd  | 2,5
 Richard |  Morris       | We945kfGGE  | 3
 George  |  Washington   | ssf4gt66hJ  | 7,39494

如何根据长度获取 ONE 行中每一列的实际 LONGEST 值?

我需要对每种数据类型均有效的内容- NUMBER,VARCHAR,DATE 等。

示例表的输出应为(序列号都相同的长度,因此在这里不重要...):

 Name    |  Surname      | Serial no.  | Price
-----------------------------------------------
 Richard |  Washington   | A12444dW33  | 7,39494

我发现的所有问题都只针对一列,但我需要所有列的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以使用keep

select max(name) keep (dense_rank first order by length(name) desc),
       max(Surname) keep (dense_rank first order by length(Surname) desc),
       max(serial) keep (dense_rank first order by length(serial) desc),
       max(price) keep (dense_rank first order by length(price) desc)
from t;

答案 1 :(得分:3)

您可以使用MAX( column ) KEEP ( DENSE_RANK [FIRST|LAST] ORDER BY ... )

SELECT MAX( Name      ) KEEP ( DENSE_RANK FIRST ORDER BY LENGTH( Name      ) DESC ) AS Name,
       MAX( Surname   ) KEEP ( DENSE_RANK FIRST ORDER BY LENGTH( Surname   ) DESC ) AS Surname,
       MAX( Serial_no ) KEEP ( DENSE_RANK FIRST ORDER BY LENGTH( Serial_no ) DESC ) AS serial_no,
       MAX( Price     ) KEEP ( DENSE_RANK FIRST ORDER BY LENGTH( Price     ) DESC ) AS Price
FROM   your_table;

输出:

NAME    | SURNAME    | SERIAL_NO  |   PRICE
:------ | :--------- | :--------- | ------:
Richard | Washington | ssf4gt66hJ | 7.39494

db <>提琴here

相关问题