使用 Microsoft Access 時,您常會需要直接使用不在資料中的值。 例如,您想要計算某份訂單的營業稅或訂單本身的總價值。 您可以使用運算式來計算這些值。 為了進行運算,您得以正確的語法撰寫運算式。 語法是一套以正確方式組合運算式中字詞與符號的規則。 在一開始,Access 裡的運算式會有些難以閱讀, 不過在正確了解運算式語法,並稍加練習之後,就容易多了。
本文內容
運算式概觀
運算式是由下列部分或全部項目組合而成:內建函數或使用者定義的函數、識別碼、運算子、值和常數,以此求出單一個值。
例如,以下運算式包含了常見的元素:
=Sum([Purchase Price])*0.08
-
Sum() 是內建函數
-
[Purchase Price] 是識別碼
-
* 是數學運算子
-
0.08 是常數
這個運算式可以用於表單尾或報表尾的文字方塊中,以計算一組產品的營業稅。
運算式可能比這個範例複雜得多,也可能簡單得多。 例如,這個布林值運算式只包含一個運算子和一個常數:
>0
這個運算式會在︰
-
與大於 0 的數字比較時,傳回 True。
-
與小於 0 的數字比較時,傳回 False。
您可以在控制項或資料表欄位的 [驗證規則] 屬性中使用這個運算式,以確保只輸入正數值。 很多地方都可以使用運算式來執行計算、控制字元或測試資料。 資料表、查詢、表單、報表和巨集都有接受運算式的屬性。 例如,您可以在控制項的 [控制項資料來源] 和 [預設值] 屬性中使用運算式。 也可以在資料表欄位的 [驗證規則] 屬性中使用運算式。
運算式的組成
若要建立運算式,您需要使用函數、運算子、常數和值來結合識別碼。 任何有效運算式都必須含有至少一種函數或一項識別碼,且可以同時包含常數或運算子。 您也可以將運算式當做另一個運算式的一部分 (通常是做為函數中的引數)。 這就稱為巢狀運算式。
-
識別碼 一般形式為:
[Collection name]![Object name].[Property name]
您只需要在識別碼中,指定足夠讓它成為運算式中唯一識別碼的項目即可。 識別碼不常以 [Object name] 的形式出現。
-
函數 一般形式為:
Function(argument, argument)
其中一個引數通常是識別碼或運算式。 部分函數並不需要引數。 在您使用特定函數前,請再次查閱該函數的語法。 如需詳細資訊,請參閱函數 (依類別排列)。
-
運算子 一般形式為:
Identifier operator identifier
關於此形式的例外狀況,請參閱運算子一節的詳細說明。
-
常數 一般形式為:
Identifier comparison_operator constant
-
值 值可能會發生在運算式中的多個位置。
物件、集合和屬性
Access 資料庫中所有資料表、查詢、表單、報表及欄位都可以稱為個別的「物件」。 每個物件都有其名稱, 有些物件可能已經完成命名 (例如以 Microsoft Office Access 連絡人範本為基礎建立之資料庫的 [連絡人] 資料表), 若您建立了新的物件,請為它命名。
一組內容全都為某種特定物件類型的組合稱為「集合」。 舉例來說,一個資料庫中所有資料表的組合為一個集合。 您資料庫中的物件可能屬於某個集合,同時也是含有其他物件的集合。 例如,資料表是一個包含欄位物件的集合。
物件擁有「屬性」,屬性會描述物件的特性,並提供變更這些特性的方法。 例如,查詢物件具有的 [預設檢視方法] 屬性,能描述並讓您指定執行該查詢時的顯示方式。
下圖說明集合、物件和屬性之間的關係:
|
3 一個屬性 2 一個物件 1 一個集合 |
識別碼
在運算式中使用物件、集合或屬性時,您需要使用「識別碼」來參照至該元素。 識別碼會包含您要識別之元素的名稱以及它所屬元素的名稱。 舉例來說,一個欄位的識別碼會包括欄位名稱,以及該欄位所屬資料表的名稱。 這類識別碼的例子為:
[Customers]![BirthDate]
某些情況下,元素的名稱可當做識別碼。 當元素名稱在您建立的運算式內容中為唯一值時,此規則即會成立。 識別碼的其他部分則由上下文進行推斷。 舉例來說,如果您設計的查詢中只使用一個資料表,那麼欄位名稱本身即可當成識別碼使用,因為資料表中的欄位名稱勢必為該資料表中的唯一值。 由於只使用一個資料表,在脈絡上,您於查詢中參照的任何欄位識別碼都是暗指該資料表名稱而言。
在其他情況下,您必須明確指出識別碼的各部分才能讓參照發揮作用。 若識別碼不是運算式中的唯一值,此規則即會成立。 當所指模稜兩可時,您就必須明確指定識別碼的各部分,讓它成為上下文脈絡中的唯一值。 例如,假設您設計的查詢中使用了兩張資料表:[產品] 和 [訂單],且這兩者都各自有一個叫做 [產品識別碼] 的欄位。 在這種情況下,您在查詢中用來參照至任一 [產品識別碼] 欄位的識別碼除了欄位名稱之外,還必須再加上資料表的名稱。 例如:
[Products]![ProductID]
識別碼運算子 在識別碼中,您可以使用三種運算子:
-
驚嘆號運算子 (!)
-
點運算子 (.)
-
方括號運算子 ([ ])
這些運算子的使用方法為:以方括號將識別碼的各部分括起來,然後使用驚嘆號或點運算子進行連接。 例如,[員工] 資料表中 [姓氏] 欄位的識別碼可以表示為 [Employees]![Last Name]。 驚嘆號運算子會告訴 Access,在運算子後方的物件屬於運算子前方所述之集合。 在這個例子中,[姓氏] 是一個屬於 [員工] 集合的欄位物件,而後者本身也是一個資料表物件。
嚴格來說,您並不必每次都以方括號括住部分或是整個識別碼。 如果識別碼中沒有空格或其他特殊字元,Access 會在讀取運算式時自動加上括號。 不過,由您自行輸入括號是個良好習慣,可以協助您避免錯誤發生,也能讓您一眼認出運算式中哪些部分是識別碼。
函數、運算子、常數和值
建立運算式不只需要識別碼,您還需要執行某種動作。 您可以使用函數、運算子和常數來執行運算式中的動作。
函數
函數是一種您可以在運算式中使用的程序。 有些函數 (例如 Date) 不需要輸入任何項目就能運作。 不過,大部分的函數都需要您輸入「引數」。
在本文開頭提到的範例中,DatePart 函數使用了兩個引數:一個是 interval 引數 (其值為 "yyyy"),以及 date 引數 (其值為 [Customers]![BirthDate])。 DatePart 函數至少需要兩個引數 (interval 和 date),但最多可以接受四個引數。
下列清單列出一些運算式常用的函數。 如需函數使用語法的詳細資訊,請按一下各函數連結。
-
Date 函數可在運算式中插入目前系統的日期。 常與 Format 函數一起使用,也會搭配含有日期/時間資料之欄位的欄位識別碼。
=Date()
-
DatePart 函數可用來判斷或擷取日期的一部分,該日期通常取自欄位識別碼,但有時會是由其他函數 (如 Date) 傳回的日期值。
DatePart ( "yyyy", Date())
-
DateDiff 函數可用來判斷兩個日期間的差距,通常其中一個日期會取自欄位識別碼,而另一個則是使用 Date 函數取得的日期。
=DateDiff(“d”, Now(), [Orders].[ReceiveBefore])-10
-
Format 函數可用來將格式設定套用至識別碼及其他函數得出的結果。
Format([Date],"ww")=Format(Now(),"ww")-1
-
IIf 函數可以將運算式評估為 True 或 False,然後在運算式評為 True 時傳回一個值,並在評為 False 時傳回另一個值。
=IIf([CountryRegion]="Italy", "Italian", "Some other language")
-
InStr 函數可用來搜尋某個字元或某字串在另一個字串中的位置。 函數所搜尋的字串通常取自欄位識別碼。
InStr(1,[IPAddress],".")
-
Left、Mid 和 Right 函數可以用來擷取字串中的字元,依序分成從最左邊的字元開始擷取 (Left)、從中間特定位置開始擷取 (Mid),或是從最右邊的字元開始擷取 (Right)。 通常會搭配 InStr 函數使用。 這些函數用來擷取字元的字串通常取自欄位識別碼。
Left([ProductName], 1) Right([AssetCode], 2) Mid([Phone],2,3)
如需函數清單,請參閱函數 (依類別排列)。
運算子
運算子是用來表示運算式中,其他元素之間特定算數或邏輯關係的字詞或符號。 運算子可以是:
-
算數運算子,例如加號 (+)。
-
比較運算子,例如等號 (=)。
-
邏輯運算子,例如 Not。
-
串連運算子,例如 &。
-
特殊運算子,例如 Like。
運算子通常用來表示兩個識別碼之間的關係。 下列各表將說明 Access 運算式中可用的運算子。
算術運算子
算術運算子可用來計算兩個或多個數字的值,或者將數字的正號變成負號。
運算子 |
目的 |
範例 |
---|---|---|
+ |
將兩個數目相加。 |
[小計]+[營業稅] |
- |
將兩個數字相減求其差值,或用於表示數字為負值。 |
[價格]-[折扣] |
* |
將兩個數字相乘。 |
[數量]*[價格] |
/ |
將第一個數字除以第二個數字。 |
[合計]/[項目計數] |
\ |
將兩個數字四捨五入為整數,將第一個數字除以第二個數字,再將結果捨去為整數。 |
[已登錄的數目]\[會議室的數目] |
Mod |
將第一個數字除以第二個數字,然後只傳回餘數。 |
[已登錄的數目] Mod [會議室的數目] |
^ |
傳回指數乘幕的數字。 |
數字 ^ 指數 |
比較運算子
您可以使用比較運算子來比較值,並傳回 True、False 或 Null (未知值) 其中一種結果。
運算子 |
目的 |
---|---|
< |
判斷第一個值是否小於第二個值。 |
<= |
判斷第一個值是否小於或等於第二個值。 |
> |
判斷第一個值是否大於第二個值。 |
>= |
判斷第一個值是否大於或等於第二個值。 |
= |
判斷第一個值是否等於第二個值。 |
<> |
判斷第一個值是否不等於第二個值。 |
在所有案例中,只要第一個值或第二個值為 Null,則結果也為 Null。 這是因為 Null 代表未知值,所以任何與 Null 比較的結果也會是未知的。
邏輯運算子
您可以使用邏輯運算子來結合兩個值,然後傳回 True、False 或 Null 其中一種結果。 邏輯運算子也稱為布林值運算子。
運算子 |
用法 |
描述 |
---|---|---|
And |
運算式1 And 運算式2 |
當運算式1 和運算式2 皆為 True 時,結果為 True。 |
Or |
運算式1 Or 運算式2 |
當運算式1 或運算式2 任何一個為 True 時,結果為 True。 |
Eqv |
運算式1 Eqv 運算式2 |
當運算式1 和運算式2 皆為 True,或運算式1 和運算式2 皆為 False 時,結果為 True。 |
Not |
Not 運算式 |
運算式不是 True 時,結果為 True。 |
Xor |
運算式1 Xor 運算式2 |
當運算式1 為 True,或運算式2 為 True,但並非兩者同時為 True 時,結果為 True。 |
串連運算子
您可以使用串連運算子,將兩個文字值結合成一個字串。
運算子 |
用法 |
描述 |
---|---|---|
& |
字串1 & 字串2 |
將兩個字串結合成為一個字串。 |
+ |
字串1 + 字串2 |
將兩個字串結合成為一個字串,並且傳播 Null 值。 |
特殊運算子
您可以如下表所述來使用特殊運算子。
運算子 |
描述 |
其他詳細資訊 |
---|---|---|
Is Null or Is Not Null |
判斷值為 Null 或 Not Null。 |
|
Like "pattern" |
使用萬用字元運算子 ? 和 * 來比對字串值。 |
|
Between val1 And val2 |
判斷某數字或日期值是否落在範圍內。 |
|
In(string1,string2...) |
判斷一組字串值中是否包含某字串值。 |
常數
常數是一種您可以在運算式中使用,且不會變動的已知值。 Access 中有四種常用的常數:
-
True:表示邏輯為 True 的項目。
-
False:表示邏輯為 False 的項目。
-
Null:表示缺少已知的值。
-
"" (empty string):表示已知為空白的值。
常數可當做函數中的引數,也可用來做為運算式中準則的一部分。 例如,您可以將空字串常數 ("") 當做某查詢中資料欄準則的一部分,以用來評估該資料欄的欄位值,方法是輸入 <>"" 做為準則。 在這個範例中,<> 是運算子,而 "" 是常數。 放在一起時表示它們會將所套用的識別碼與空字串進行比較。 當識別碼的值為空字串以外的任何其他值時,運算式的結果為 True。
使用 Null 常數時請務必謹慎小心。 大多數情況下,搭配使用 Null 和比較運算子得到的結果會為錯誤。 如果您想要在運算式中比較 Null 和某個值,請使用 Is Null 或 Is Not Null 運算子。
值
您可以在運算式中使用常值,例如數字 1,254 或字串 "Enter a number between 1 and 10"。 您也可以使用數值,數值可以是包含正負號和小數點 (如有需要) 的一串數字。 沒果沒有加上正負號,Access 會假設數字為正值。 如果要使用負值,請加上減號 (-)。 您也可以使用科學記號標記法。 若要這麼做,請加入 "E" 或 "e" 以及指數符號 (例如 1.0E-6)。
當您使用文字字串時,請用引號括住,Access 才更能正確地解譯。 在某些情況下,Access 會為您加上引號。 例如,當您在驗證規則或查詢準則運算式中輸入文字時,Access 會自動為您的文字字串加上引號。
例如,如果您輸入 Paris 這個字,Access 就會在運算式中顯示 "Paris"。 如果您希望運算式產生加上引號的字串,請將巢狀字串置於單 (') 引號或三組雙 (") 引號中。 例如,下列運算式是相同的:
Forms![Contacts]![City]. DefaultValue = ' "Paris" '
Forms![Contacts]![City].DefaultValue = " " "Paris" " "
若要使用日期/時間值,請使用井號 (#) 將值括住。 例如,#3-7-17#、#7-Mar-17# 和 #Mar-7-2017# 都是有效的日期/時間值。 當 Access 遇到用 # 字元括住的有效日期/時間值時,會自動將值視為「日期/時間」資料類型。
在 Web 資料庫中,運算式的巢狀限制是 65 個層級
巢狀結構超過 65 層的運算式無法在瀏覽器中運作,因此您不應該在 Access Web 資料庫中使用這類運算式。 您將不會收到任何錯誤訊息,只是運算式不會發生作用而已。
使用 &、AND 及 OR 運算子可以在伺服器上建立不會反映到 Access 用戶端的其他巢狀層級。 例如,運算式 "a" & "b" & "c" 在運算式建立器中不是巢狀結構,但是在 SharePoint 中,該運算式會變成 concatenate.Db("a", concatenate.Db("b", "c") )。 這項轉譯會建立一個層級的巢狀結構。 如果在單一運算式中使用許多連續的 &、AND 或 OR 運算子,便可能會超過 65 個層級的伺服器巢狀限制,因而導致運算式無法在瀏覽器中運作。