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”?)
在 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”?)