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