随笔-30  评论-123  文章-0  trackbacks-0
接上文...

三、多数据库的考虑

1.        字符串连接必须用“||”符号,不使用“+”。注意:在Oracle中一个null值与非null值连接,结果为非null值,在DB2SqlServer中相反。使用nvlnull转换为’’。

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运算符。否则在Oracledecode函数无法表达。
   当必须使用 <, >, != 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,12…等值,也必须表达为
0’,’1’,’2’… 

12.    castconvert语句中只支持到字符型、日期型和数字型的转换,且日期型只支持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  (该语句中表ab同时连接到了表c
)
             a  left outer join b on a.fda=b.fdsf  left outer join a on b.fdsa=a.fsdff  (该语句中表ab互联
)

16.    join on 必须严格匹配,不允许出现没有onjoin


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 学二的猫 阅读(1565) 评论(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,唉,技术界可能太浮躁了。
不管怎样,还是很高兴能看到这样一个重量级的产品的技术资料。谢谢了!
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: