接上文...
三、多数据库的考虑
1. 字符串连接必须用“||”符号,不使用“+”。注意:在Oracle中一个null值与非null值连接,结果为非null值,在DB2和SqlServer中相反。使用nvl对null转换为’’。
2. 通配符不能使用‘[a-c]%’这种形式,应写成如:select * from table_name where col1 like ‘[a]%’ OR col1 like ‘[b]%’ OR col1 like ‘[c]%’ 。
3. 在对char类型比较时,要对列加上rtrim()函数,否则在Oracle中不会得到正确结果。例如若test表中的字段f1的长度为10,内有一个值为’aa’,的纪录,则语句select len(f1) from test;在SqlServer的执行结果为2,在Oracle的执行结果为10。
4. 在Case when语句中只能出现 =、>=、<= 以及is null运算符,不能出现 <、>、<>、!=、以及is not null运算符。否则在Oracle的decode函数无法表达。
当必须使用 <, >, != ,is not null时,建议采用如下变通方法:
1)使用 !=时:例如 case when A!=B then e,
可改为: case A=b then e1 else e (间接实现 A!=B)
2)使用 < 时:例如 case when A<B then e,
可改为: case A<=b then case A=B then e1 else e (间接实现 A<B)
或 case A>=b then e1 else e (间接实现 A<B)
3)使用 > 时:例如 case when A>B then e,
可改为: case A>=b then case A=B then e1 else e (间接实现 A>B)
或 case A<=b then e1 else e (间接实现 A>B)
4)使用is not null 时:例如 case when A is not null then e,
可改为: case A is null then e1 else e (间接实现 A is not null)
特别说明:当执行大数据量的操作时,sql Server 对 case when 的执行效率极低,甚至可能会死机,因此希望大家尽量不要使用case when。
5. 参与左连接的列不能为常量。例如,不允许如下语句: select * from t1 left outer join t2 on t1.f1='A'。
6. 左连接的写法必须带“outer”关键字。例如: select f1 from t1 left outer t2 on t1.f1 = t2.f1;而不是: select f1 from t1 left t2 on t1.f1 = t2.f1。
7. 只能使用以下函数,如要使用新的函数必须申报,审批后才能使用。函数:coalesce, cast, len, left, replace, right, substring, lower, upper, ltrim, rtrim, abs, acos, asin, atan, cos, ceiling, exp, floor, log, power, round, sign,sin, square, sqrt, tan, count, max, min, sum, avg。
8. substring函数中起始位置为1,表示从头开始。
9. Like 的一边必须是字符串,只能在一边出现表列。
10. 在SQL语句中不能直接使用null,必须对null指明类型,在判断某值为null时除外。
11. 对于一些char/varchar的字段的值,即使是0,1,2…等值,也必须表达为’0’,’1’,’2’…
12. 在cast和convert语句中只支持到字符型、日期型和数字型的转换,且日期型只支持UFDate的格式,即’YYYY’-‘MM’-‘DD’
13. insert 语句不通过SQL翻译器,在insert中不允许使用select。
14. 不能通过来percent n 限制查询结果集的记录数,也不能使用 select top n 的语句
15. outer join 前后的表不能互相连接,不能重复连接,即不能出现以下形式的语句:
a left outer join c on a.fda=c.fdsf left outer join b on b.fdsa=c.fsdff (该语句中表a、b同时连接到了表c上)
a left outer join b on a.fda=b.fdsf left outer join a on b.fdsa=a.fsdff (该语句中表a、b互联)
16. join 与on 必须严格匹配,不允许出现没有on的join。
17. join…on 后面慎用 or,如果用到,请把or的范围用( )括起来
18. 如果某个表有别名,则必须引用它的别名,不许引用它原来的表名
19. 在子查询中前后必须加上括号
20. order by 后的列名在select后有多个相同的列,例如不能写为:
select a, b, a, a from fdsf order by a (a 在select后出现了多次)可以给a 加别名
21. 不能使用select into 的格式
22. 给某个字符型的列赋值时,如果其值含有单引号,例如:set col=’fsdf’fdsfdsf’sdf’…, 有两种解决方案:
1)将单引号写成’’,即 set col=’fsdf’’fdsfdsf’’sdf’
2)通过set的方式赋值,即:set col= ? …
然后:setString(8,” ’fsdf’fdsfdsf’sdf’”)
posted on 2006-04-23 00:41
学二的猫 阅读(1586)
评论(1) 编辑 收藏 所属分类:
数据库技术
SQL开发手册(2)"
trackback:ping="http://www.blogjava.net/hsith/services/trackbacks/42566.aspx" />
-->
评论:
# re: NC-->SQL开发手册(2)
2006-04-24 11:37 |
难以想象NC现在居然还是在这样的技术规范下维护
以上所列有很多项已经过时(例如第4条关于case when,oracle从9已经支持了),并且直接这样使用sql开发的方式已经值得推敲。
可能直接使用朴素的技术也能开发出很好的产品,让我想起了compiere,唉,技术界可能太浮躁了。
不管怎样,还是很高兴能看到这样一个重量级的产品的技术资料。谢谢了!
回复 更多评论