隨筆-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 學二的貓 閱讀(1626) 評論(1)  編輯  收藏 所屬分類: 數據庫技術
          SQL開發手冊(2)" trackback:ping="http://www.aygfsteel.com/hsith/services/trackbacks/42566.aspx" /> -->

          評論:
          # re: NC-->SQL開發手冊(2) 2006-04-24 11:37 | 黃金時代已過
          難以想象NC現在居然還是在這樣的技術規范下維護
          以上所列有很多項已經過時(例如第4條關于case when,oracle從9已經支持了),并且直接這樣使用sql開發的方式已經值得推敲。
          可能直接使用樸素的技術也能開發出很好的產品,讓我想起了compiere,唉,技術界可能太浮躁了。
          不管怎樣,還是很高興能看到這樣一個重量級的產品的技術資料。謝謝了!
            回復  更多評論
            
          主站蜘蛛池模板: 东安县| 崇州市| 永兴县| 嵩明县| 鄂托克前旗| 凌海市| 敖汉旗| 东乡| 杨浦区| 光泽县| 东辽县| 精河县| 惠东县| 辽中县| 米易县| 武乡县| 边坝县| 龙口市| 营山县| 赤峰市| 武冈市| 斗六市| 乡宁县| 夏邑县| 宜宾市| 环江| 额尔古纳市| 马龙县| 庆城县| 阿城市| 周口市| 阜南县| 阳朔县| 梧州市| 江陵县| 上杭县| 彩票| 同仁县| 遂溪县| 方正县| 龙胜|