小议ORDER BY语句中的常数
上一篇 / 下一篇 2007-02-20 00:00:00 / 个人分类:ORACLE
前两天在论坛看到一个问题,本来认为是与全文索引的问题有关,后来却发现是和ORDER BY有关:http://www.itpub.net/showthread.php?s=&threadid=724865
*f*{|7@c G]#T7590422
看到完整的SQL语句后,我就怀疑到问题出在ORDER BY语句中,根据语法,是不能对表名、列名等对象名称采用绑定变量的。
不过由于最近过节,实在是比较懒,也一直没有进行测试,直到今天才验证了一下。
SQL> CREATE TABLE T AS SELECT * FROM DBA_USERS;
表已创建。
SQL> SELECT USER_ID, USERNAME FROM T;
USER_ID USERNAMEITPUB个人空间8S
j"{c
tv
---------- ------------------------------
t2yOv}0q7590422 0 SYS
N7O-Kfc/BAO7590422 5 SYSTEMITPUB个人空间(?eRJ0d[|
19 DBSNMPITPUB个人空间xA
Z;ngeE
27 PROXY_REFRESHER
,[@:`(I6N[B7590422 60 SELEITPUB个人空间tj9UF6~
t$n
29 SCOTTITPUB个人空间8[| Va,@/_aW;e
28 HR1
5m$@Cv1Yg6O7590422 21 WMSYSITPUB个人空间f/o yS"h b
11 OUTLN
R.P:\[U9rKj
gH7590422 26 PROXY_MVIEWADMINITPUB个人空间0n(P5h }~(M'o U
46 TSMITH
{-jku$oJ9}7590422 25 REPADMIN
Y`g4@B4A;r
?&FL&Y7590422 30 HR
Rc0Yywt4HE7590422 23 YANGTK
已选择14行。
SQL> SELECT USER_ID, USERNAME FROM T ORDER BY USER_ID;
USER_ID USERNAME
3k3m6N5z;S&i"J7590422---------- ------------------------------ITPUB个人空间)A?,z|;^
J!k5t
0 SYS
:dLHSA^uas9r7590422 5 SYSTEM
Co0{&h&cn'?2d7590422 11 OUTLNITPUB个人空间u.Ck(zG
19 DBSNMPITPUB个人空间"nS u8h!ww:AA
21 WMSYSITPUB个人空间Fv%e&Q(hD6HXa+O
23 YANGTKITPUB个人空间
N&JiH.dIP
25 REPADMIN
o8BJVUd-Q7590422 26 PROXY_MVIEWADMINITPUB个人空间!]S,W-f'dE
27 PROXY_REFRESHERITPUB个人空间}/x6M9e%N7z
O t4Nw
28 HR1
f~%l H;FT7590422 29 SCOTT
"RgNkC7590422 30 HRITPUB个人空间ftw t'K!{:dSl
46 TSMITHITPUB个人空间O,c{|3?T
60 SELE
已选择14行。
SQL> SELECT USER_ID, USERNAME FROM T ORDER BY 1;
USER_ID USERNAME
ju5^y/e kv7590422---------- ------------------------------ITPUB个人空间H Q8x&{xkNQ
0 SYSITPUB个人空间:Jan0Id z3t/zA1p
5 SYSTEM
)u.v.V
xS#Aa/x7590422 11 OUTLN
.c
W(M1|nR8aX7590422 19 DBSNMP
3s;[_s#T%qr0h[7590422 21 WMSYS
-Ir,rOd7590422 23 YANGTKITPUB个人空间$?liNb*C
25 REPADMINITPUB个人空间g$K4^ ys&|YB
26 PROXY_MVIEWADMIN
@7A$}Y1? ^M7590422 27 PROXY_REFRESHERITPUB个人空间,O"u!x9]W"GU
28 HR1
kc ^1p{A{{d(y7590422 29 SCOTTITPUB个人空间&^!O0C t0B
30 HRITPUB个人空间g4Er7k/wJB"L
46 TSMITHITPUB个人空间]!zk
p-L2V
60 SELE
已选择14行。
上面是ORDER BY的两种基本用法,一种是指定SELECT语句列表中的列表或别名,另一种是列的位置。
如果这里采用帮定变量,那么结果是什么呢?
SQL> SELECT USER_ID, USERNAME FROM T ORDER BY :NAME;
USER_ID USERNAMEITPUB个人空间?ZOX/|V%BK
---------- ------------------------------
e7p)O\8})N4q1](Q7590422 0 SYS
B/E!^|[Ef7590422 5 SYSTEMITPUB个人空间|WxEc2xc[
19 DBSNMP
l/fu4z/C0URl`K@7590422 27 PROXY_REFRESHERITPUB个人空间]t1t$\!}H/K+d6r
60 SELEITPUB个人空间DXX`
b$v
29 SCOTT
S
H*@mne#yS Z7590422 28 HR1ITPUB个人空间7Ej7Z)Z h
21 WMSYS
RfAv$`a7590422 11 OUTLN
`P v~uJ O#P9V8z8v7590422 26 PROXY_MVIEWADMINITPUB个人空间'`HyO&A?-l!M
46 TSMITH
}B'c.bg9R^o+mJE7590422 25 REPADMIN
;qM
ID,{i0O7590422 30 HR
$gtZ`U#sfN8p7590422 23 YANGTK
已选择14行。
通过上面的结果可以看到,Oracle虽然没有报错,可以正常执行,但是并没有根据USERNAME列进行排序。
实际上,根据绑定变量的特点,这里输入的USERNAME并不是列名,而是一个字符串常量,因此上面的SQL等价于:
SQL> SELECT USER_ID, USERNAME FROM T ORDER BY 'USERNAME';
USER_ID USERNAMEITPUB个人空间*u7K!v1rF
---------- ------------------------------ITPUB个人空间/UV;^2Hlp
J~v
0 SYS
6jvEs
C
YO(U7590422 5 SYSTEM
~5|a;y];_
Hd7590422 19 DBSNMP
"x"Kb6{o}Wg\Eg7590422 27 PROXY_REFRESHERITPUB个人空间i
q0sj\%`4y
60 SELE
&y4K+RV
u3w)T$O3{7590422 29 SCOTTITPUB个人空间3JvNhy
28 HR1ITPUB个人空间5R9I&c.m4X9Z
21 WMSYS
N gY#o6k K
H4?U\2x7590422 11 OUTLN
2b3{G [Hl7590422 26 PROXY_MVIEWADMINITPUB个人空间2SHl0I/vK"WUv
46 TSMITH
yf*[MD:ki7590422 25 REPADMINITPUB个人空间&f?o `-V8bO
30 HRITPUB个人空间-?(V`,NYP|
23 YANGTK
已选择14行。
而且通过测试发现,查询结果与ORDER BY中的字符串常量的内容没有关系,与ASC和DESC关键字也没有任何关系:
SQL> SELECT USER_ID, USERNAME FROM T ORDER BY 'ABC';
USER_ID USERNAMEITPUB个人空间1a+?([0}9W8T4I
---------- ------------------------------
:J3o%F4e-s K?3e
f%D'E7590422 0 SYS
x
O{h n
zO7590422 5 SYSTEM
4Fm9UW5K#s-y7590422 19 DBSNMPITPUB个人空间F YH5?o
27 PROXY_REFRESHER
xo_*__{E7590422 60 SELE
|G&p+jdr7590422 29 SCOTTITPUB个人空间
Ld0w'o%FR
28 HR1ITPUB个人空间nFGJ5K4Li2N
21 WMSYS
(ou3g:P&N7p)co[`7590422 11 OUTLNITPUB个人空间,W
jp*l"iWig3d
26 PROXY_MVIEWADMIN
3C*~ }6W xP7590422 46 TSMITHITPUB个人空间Pm:s`#MTVJt
25 REPADMIN
"S*M,|0A9S7590422 30 HR