oracle中串联列的MAX如何工作?

How MAX of a concatenated column in oracle works?

在 Oracle 中,在尝试连接两个 Number 类型的两列然后尝试对其取 MAX 时,我遇到了一个问题。 即 Number 数据类型的 A 列 B 列,

Select MAX(A||B) from table

Table数据

A           B
20150501    95906
20150501    161938

当我 运行 来自 table

的查询 Select MAX(A||B)

O/P - 2015050195906

理想情况下 20150501161938 应该是输出?????

我正在尝试将 B 列格式化为 TO_CHAR(B,'FM000000') 并执行我得到预期的输出。

Select MAX(A || TO_CHAR(B,'FM000000')) FROM table

O/P - 2015011161938

为什么在第一种情况下 2015050195906 被认为是 MAX。

串联将产生 character/text 输出。因此,它按字母顺序排序,因此 9 出现在 16.

之后

在第二种情况下,您指定了一种格式来将数字填充为六位数字。这很好用,因为 095906 现在会出现在 161938.

之前

你应该转换成数字;

select MAX(TO_NUMBER(A||B)) from table

据推测,A 列是日期,B 列是时间。

如果这是真的,请这样对待它们:

select max(to_date(to_char(a)||to_char(b,'FM000000'),'YYYYMMDDHH24MISS')) from your_table;

这将为时间组件添加前导 space(如有必要),然后将列连接成一个字符串,然后将其传递给 to_date 函数,然后 max 函数将视为 DATE 数据类型,这大概是您想要的。

PS:这里真正的解决方案是修复数据模型。不要将日期和时间存储为数字。除了像这样对问题进行排序之外,优化器还会感到困惑。 (如果您将日期存储为数字,优化器如何知道“20141231”后紧接着是“20150101”?)