很久沒有弄asp了,前幾天朋友請我改乙個程式,發現access裡sum出來的值是沒有辦法判斷的。如select sum(price) from sy_product where name like 'x%' 這樣的語句執行後如果沒有找到類似的記錄,就會返回乙個空值,前台用null判斷根本就判斷不出來。為些找了一下access中sql的空值判斷函式。非常的特別是nz。上面的語句修改成select nz(sum(price),0) from sy_product where name like 'x%' 就可以了。
但在asp裡執行的時候會報錯:提示『nz()函式未定義』,解決辦法:改成select iif(isnull(sum(price)),0,sum(price)) from sy_product where name like 'x%'
以下這篇有詳細的說明。
在鏈結到乙個sql server資料庫的access專案(即.adp檔案)中,你平時經常使用的access函式通常是不支援的。但大多數時候,都可換用sql server支援的乙個transact-sql(t-sql)函式。乙個特例是access的空值(null)函式nz和isnull;它們的功能相似,但並不是access和t-sql都能支援它們。本文要討論在什麼時候以及如何使用這兩個函式來處理空值。
在鏈結到乙個sql server資料庫的access專案(即.adp檔案)中,你平時經常使用的access函式通常是不支援的。但大多數時候,都可換用sql server支援的乙個transact-sql(t-sql)函式。乙個特例是access的空值(null)函式nz和isnull;它們的功能相似,但並不是access和t-sql都能支援它們。本文要討論在什麼時候以及如何使用這兩個函式來處理空值。
空值的重要性
空值是完全合法的資料庫錄入項,它們能提供的資訊可能超過你的想象。空值指明乙個值是未知的,但這並不是說該值不可接受或者不存在。空值表明乙個值尚未確定,而且除非確定了合適的值,否則該值將保持未知狀態,也就是為乙個空值。
開發者的職責是判斷空值可能在什麼時候出現,並針對性地處理那些值。乙個方案是在資料輸入時拒絕空值,從而完全迴避它們。但這樣一來,你的資料將完全禁止空值,所以該方案的缺點在於,在你建立一條記錄時,所有資料都必須是已知的。遺憾的是,對於大多數人來說,這個方案都不現實。以醫院急診室的資料庫系統為例,是不是因為資料錄入員不知道乙個病人的中間名,就拒絕為其建立一條記錄呢?所以,對空值進行妥善處理可提供更靈活的方案,因為即使資料錄入員當時不知道所有資料,也能成功地建立記錄。
認識到空值無法避免之後,你的職責就是正確處理它們,確保它們不會導致錯誤。正確處理空值有兩方面的好處:
access 中的空值
access提供大量工具來操縱空值:
以上函式在本質上存在細微差異。is null和isnull捕捉空值;而nz函式處理空值。換言之,如果想返回的不是實際儲存的空值,就使用nz。例如,你可顯示乙個簡單字串(例如"n/a"),讓使用者知道資料對於當前記錄來說「不可用」。另外,當空值在表示式中使用之前,你可以捕捉空值,因為空值經常會返回錯誤。
通過鏈結表或者access專案來使用access和sql server時,會產生乙個問題,因為access和sql server不是用相同的函式來判斷空值。因此,你必須知道要使用什麼函式,以及在什麼時候使用。
在.mdb檔案中使用nz
大多數access使用者和開發者都熟悉nz函式,它在遇到空值時返回除空值之外的其他值。該函式的形式如下,其中variant代表variant資料型別,而valueifnull是乙個可選引數,它負責在variant為空值時提供真正的返回值。
nz(variant[, valueifnull])
如省略valueifnull,nz返回值0或乙個零長度字串(""),具體由variant的資料型別決定。
圖a的查詢展示了如何使用nz及其結果。該查詢基於access示例資料庫northwind中的employees表。
圖a498)this.style.width=498;">
兩個nz函式都返回字串資料型別,因為region的資料型別為text
如圖b所示,兩個nz函式都返回字串值,而不是空值,但具體的字串是不同的。第乙個表示式返回字串"n/a"來取代空值:
withoptional: nz([region],"n/a")
圖b498)this.style.width=498;">
nz返回乙個實際的值,而不是容易使人產生誤解的空值第二個表示式返回零長度的字串來取代空值:
withoutoptional: nz([region])
雖然這樣為使用者提供的資訊較少,但卻有效防止了在後續的表示式中使用空值,從而避免資料庫出錯。圖c顯示的新表示式證明了這一點。
圖c498)this.style.width=498;">
表示式可能不能像預期的那樣處理空值
兩個表示式都直接或間接依賴於region欄位中的值。第乙個表示式直接引用region欄位:
regionstring: iif([region]="","n/a",[region])
只看表示式,你可能認為結果記錄集的每個欄位中都應該出現乙個字串。圖d展示了實際結果,它和你設想的不符,並不是每個欄位都包含乙個字串。事實上,只有在字段包含零長度字串("")的前提下,表示式才會返回字串"n/a"。我們知道,這些看似空白的字段包含空值,而不是零長度的字串。但是,錯誤是可以理解的,也是能避免的。
圖d498)this.style.width=498;">
遇到空值時,用nz返回值而不是錯誤
下乙個表示式也引用了region值,只是通過nz函式的結果來間接地引用:
withoutoptionalstring: iif([withoutoptional]="","n/a",[withoutoptional])
這樣一來,任何空值都可用乙個更確切的值來表示,並在後續任何表示式中進行求值。如圖d所示,表示式在處理空白region欄位時沒什麼問題。只有「未預計到」或者「未知」的空值才會導致問題。
nz在專案中無法工作
有人以為access專案也支援nz函式,但實情並非如此。記住,專案中的表是真正的sql server表。要證明這一點非常簡單,只需使用access配套提供的示範專案northwindcs.adp。以employees表的乙個簡單檢視為基礎,並像前面在microsoft資料庫(.mdb)檔案中那樣使用nz函式,如圖e所示。試圖執行該查詢時,access會返回乙個錯誤。
圖e498)this.style.width=498;">
access專案不支援nz函式
在access專案中使用nz
在專案中不能使用nz,而應換用transact sql的isnull函式。該函式的作用與nz相似,它的形式如下:
isnull(expression, valueifnull)
兩個引數都是必需的,isnull結果值的型別由expression決定。如果valueifnull的列資料型別與expression的資料型別衝突,sql server會在你試圖輸入表示式時返回乙個錯誤。例如,假如expression基於乙個數值列,而valueifnull是乙個字串,兩個引數就會產生衝突。由於sql server無法解決衝突,所以會拒絕表示式。
為了解決上例(圖e)的問題,可將nz替換成isnull表示式,如圖f所示:
isnull(region, 'n/a')
結果與圖b相同(在withoptional欄位中)。
圖f498)this.style.width=498;">
在access專案中用isnull代替nz
避免空值錯誤
access和sql server用不同的函式來處理空值(分別是nz和isnull)。正確處理空值可防止資料庫出現執行時錯誤和生成無效資料。不要迴避空值,只需正確地處理它們。
在MySQL中空值查詢
空字串表示的是該列為空,一般查詢這種會使用到 或者 注意 和 都查不出值null的資料的 首先我們要注意一點的就是null不是任何的資料型別,所以null就不是空的字串,當我們可能在平時 非空查詢中如果使用 是查詢不出來某個字段值為null的這一條資料的.null值得可以這麼查詢 但是 select...
DOS下命令中空格處理
如果需要在dos下檢視帶有空格的資料夾 如documents and settings,program files等資料夾 可以有下面兩種處理方法 1 給資料夾加引號。如c cd c documents and settings 這樣的好處是多長的檔名都可以全部顯示出來。2 由於一般情況下dos系統...
Oracle中空值與數字相加問題
首先給大家分享乙個巨牛巨牛的人工智慧教程,是我無意中發現的。教程不僅零基礎,通俗易懂,而且非常風趣幽默,還時不時有內涵段子,像看 一樣,哈哈 我正在學習中,覺得太牛了,所以分享給大家!點這裡可以跳轉到教程 select 10 10 10 from dual 結果是30,完全沒問題。select nu...