max(字段名)中的“字段名”的数据类型是字符型的,“字段名”+ 0后,oracle会隐式的转换成数字型,字符型的最大和数值型的最大,结果是不一样的。 测试一下: create table Test ( a varchar2(20); insert into Test(a) select '1' from dual union all select '2' from dual union all select '10' from dual union all select '20' from dual union all select '4' from dual; select * from Test; A ----------------------- 1 2 10 20 4select Max(a) from Test; Max(A) ----------------------- 4select Max(a + 0) from Test; Max(A) ----------------------- 20
max(f1+0)纯粹画蛇添足. where f1=f2+0,一般用来避免优化器谓词变换
嗯,这种情况也是有的,比如在做sql优化时不想用到某个索引就可以这么处理,当然得根据实际应用。
完全的玩弄技巧,max(to_number())不就得了,代码是追求简单,而不是追求所谓的技巧
应该是MAX(NVL(字段,0))吧,因为NULL,是不能求最大的
为什么: select Max(a) from Test; Max(A) ----------------------- 4
难道本意是想nvl(sum(column_name),0)
测试一下:
create table Test ( a varchar2(20);
insert into Test(a)
select '1' from dual
union all
select '2' from dual
union all
select '10' from dual
union all
select '20' from dual
union all
select '4' from dual;
select * from Test;
A
-----------------------
1
2
10
20
4select Max(a) from Test;
Max(A)
-----------------------
4select Max(a + 0) from Test;
Max(A)
-----------------------
20
where f1=f2+0,一般用来避免优化器谓词变换
嗯,这种情况也是有的,比如在做sql优化时不想用到某个索引就可以这么处理,当然得根据实际应用。
select Max(a) from Test;
Max(A)
-----------------------
4
'12'>'1';因为前面两个1相同,但是第1个长度大于第2个,varchar2类型采用non-padded,而char采用Blank-Padded方式比较,有点不同
max(str+0),这个str字段必须是字符串类型的数字,如‘3’,‘4’等,
max(str)是把str转换成ascii码的最大值