oracle对一种sql写法的支持很有意思,求解!

yanolites 2012-03-15 06:20:01
因为不小心,写出这一类SQL来,发现很奇怪:
select count(1) from dual where+dummy is not null;

经过一番尝试,发现select和where后都可以这么写,至于其它关键字后的情况,还没有尝试过:
select+nvl(dummy,''),+dummy,+1 from dual where+1=1 and+dummy is not null and +dummy is not null;

起初以为,只是因为pl/sql有过滤功能,所以可以这么写SQL,后来发现在程序里也可以这样写。说明oracle是支持这种写法的。标准SQL语法里没见过,这样写的,至于为什么能这么写,在baidu和google里,都没有解释。

用length等函数测试过,感觉和select null || nvl(dummy,'') a, null || dummy b,nll || 1 from dual where null || 1=1 and null || dummy is not null; 等效的(和chr(0)连接就不对了),但不同的是,使用加号情况,两关键字之间可以不需要空格。所以还是有些区别的。

有了这么变态的SQL写法,在程序里写动态SQl时,就可以用 "where+dummy is not null" 代替 "where 1=1 and dummy is not null"了,不过这不是标准写法,不敢轻易使用。

为什么能这么做? 应该不会是oracle的BUG,但oracle也不会支持这么无聊的写法,另外还有哪些符号也有支持这种写法呢? 求各位大侠指点啊。
...全文
160 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
很正常呢 语法、函数太多了 想学很好不是那么容易
bean_sql 2012-03-16
  • 打赏
  • 举报
回复

很有意思 ...
cowboyhn 2012-03-16
  • 打赏
  • 举报
回复
+-*/是运算符,而+-可以对一个表达式做运算,因此可以放在一个表达式的前面。
终端用户 2012-03-15
  • 打赏
  • 举报
回复
首先不管+号能不能用,你说的动态sql拼接也不能省掉1=1
因为,直接执行where+是会出错的.
其实,这个也不是只在oracle中可以用,mysql等也可以这么写,
这个也不是什么变态用法,只不过当成省略拼接而已,也不是说任何时候都可以单做,索引这个根本就不是什么写法.
我心飞翔 2012-03-15
  • 打赏
  • 举报
回复
即使能写,也不要这样写,很难理解。

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧