使用 Microsoft Access 時,通常需要處理資料中不直接存在的數值。 例如,您想要計算某份訂單的營業稅或訂單本身的總價值。 您可以使用運算式來計算這些值。 為了進行運算,您得以正確的語法撰寫運算式。 語法是一套以正確方式組合運算式中字詞與符號的規則。 在一開始,Access 裡的運算式會有些難以閱讀, 不過在正確了解運算式語法,並稍加練習之後,就容易多了。
本文內容
運算式概觀
運算式是由下列部分或全部項目組合而成:內建函數或使用者定義的函數、識別碼、運算子、值和常數,以此求出單一個值。
例如,以下運算式包含了常見的元素:
=Sum([Purchase Price])*0.08
-
Sum()是一個內建函數 -
[Purchase Price]是一個識別碼 -
*是一個數學算符 -
0.08是一個常數
這個運算式可以用於表單尾或報表尾的文字方塊中,以計算一組產品的營業稅。
運算式可能比這個範例複雜得多,也可能簡單得多。 例如,這個布林表達式僅由一個算符和一個常數組成:
>0
這個運算式會在︰
-
True當它與大於0的數比較時, -
False當它與小於0的數字比較時,
您可以在控制項或資料表欄位的 [驗證規則] 屬性中使用這個運算式,以確保只輸入正數值。 很多地方都可以使用運算式來執行計算、控制字元或測試資料。 資料表、查詢、表單、報表和巨集都有接受運算式的屬性。 例如,您可以在控制項的 [控制項資料來源] 和 [預設值] 屬性中使用運算式。 也可以在資料表欄位的 [驗證規則] 屬性中使用運算式。
運算式的組成
若要建立運算式,您需要使用函數、運算子、常數和值來結合識別碼。 任何有效運算式都必須含有至少一種函數或一項識別碼,且可以同時包含常數或運算子。 你也可以將一個表達式作為另一個表達式的一部分使用——通常是作為函數的參數。 這就稱為巢狀運算式。
識別碼的一般形式為:
[Collection name]![Object name].[Property name]您只需要在識別碼中,指定足夠讓它成為運算式中唯一識別碼的項目即可。 識別碼常見的形式為
[Object name]。函數的一般形式為:
Function(argument, argument)其中一個引數通常是識別碼或運算式。 部分函數並不需要引數。 在您使用特定函數前,請再次查閱該函數的語法。 如需詳細資訊,請參閱函數 (依類別排列)。
運算子的一般形式為:
Identifier operator identifier關於此形式的例外狀況,請參閱運算子一節的詳細說明。
常數的一般形式為:
Identifier comparison_operator constant值可能會發生在運算式中的多個位置。
物件、集合和屬性
Access 資料庫中所有資料表、查詢、表單、報表及欄位都可以稱為個別的「物件」。 每個物件都有其名稱, 有些物件可能已經完成命名 (例如以 Microsoft Office Access 連絡人範本為基礎建立之資料庫的 [連絡人] 資料表), 若您建立了新的物件,請為它命名。
一組內容全都為某種特定物件類型的組合稱為「集合」。 舉例來說,一個資料庫中所有資料表的組合為一個集合。 您資料庫中的物件可能屬於某個集合,同時也是含有其他物件的集合。 例如,資料表是一個包含欄位物件的集合。
物件擁有「屬性」,屬性會描述物件的特性,並提供變更這些特性的方法。 例如,查詢物件具有的 [預設檢視方法] 屬性,能描述並讓您指定執行該查詢時的顯示方式。
下圖說明集合、物件和屬性之間的關係:
|
3 A 性質 2 一個物件 1 A 收藏 |
|---|
識別碼
在運算式中使用物件、集合或屬性時,您需要使用「識別碼」來參照至該元素。 識別碼會包含您要識別之元素的名稱以及它所屬元素的名稱。 舉例來說,一個欄位的識別碼會包括欄位名稱,以及該欄位所屬資料表的名稱。 這類識別碼的例子為:
[Customers]![BirthDate]
某些情況下,元素的名稱可當做識別碼。 當元素名稱在您建立的運算式內容中為唯一值時,此規則即會成立。 識別碼的其他部分則由上下文進行推斷。 舉例來說,如果您設計的查詢中只使用一個資料表,那麼欄位名稱本身即可當成識別碼使用,因為資料表中的欄位名稱勢必為該資料表中的唯一值。 由於只使用一個資料表,在脈絡上,您於查詢中參照的任何欄位識別碼都是暗指該資料表名稱而言。
在其他情況下,您必須明確指出識別碼的各部分才能讓參照發揮作用。 若識別碼不是運算式中的唯一值,此規則即會成立。 當所指模稜兩可時,您就必須明確指定識別碼的各部分,讓它成為上下文脈絡中的唯一值。 例如,假設您設計的查詢中使用了兩張資料表:[產品] 和 [訂單],且這兩者都各自有一個叫做 [產品識別碼] 的欄位。 在這種情況下,您在查詢中用來參照至任一 [產品識別碼] 欄位的識別碼除了欄位名稱之外,還必須再加上資料表的名稱。 例如:
[Products]![ProductID]
識別碼運算子:在識別碼中,您可以使用三種運算子:
- 爆炸操作員 (
!) - 點運算子 (
.) - 方括號運算子 (
[ ])
這些運算子的使用方法為:以方括號將識別碼的各部分括起來,然後使用驚嘆號或點運算子進行連接。 例如,在名為 Employees 的表格中,一個名為 Last Name 的欄位識別碼可以表示為 [Employees]![Last Name]。 驚嘆號運算子會告訴 Access,在運算子後方的物件屬於運算子前方所述之集合。 在這個例子中,[姓氏] 是一個屬於 [員工] 集合的欄位物件,而後者本身也是一個資料表物件。
嚴格來說,您並不必每次都以方括號括住部分或是整個識別碼。 如果識別碼中沒有空格或其他特殊字元,Access 會在讀取運算式時自動加上括號。 不過,自己打括號是個好習慣——這有助於避免錯誤,也能作為表達式中某個特定部分是識別碼的視覺線索。
函數、運算子、常數和值
要建立表達式,你需要的不只是識別碼——你還需要執行某種動作。 您可以使用函數、運算子和常數來執行運算式中的動作。
函數
函數是一種您可以在運算式中使用的程序。 有些函數 (例如 Date) 不需要輸入任何項目就能運作。 不過,大部分的函數都需要您輸入「引數」。
在本文開頭的範例中,DatePart 函數使用兩個參數:一個區間參數,值 "yyyy" 為 ,以及日期參數,值為 [Customers]![BirthDate]。 DatePart 函數至少需要兩個引數 (interval 和 date),但最多可以接受四個引數。
下列清單列出一些運算式常用的函數。 如需函數使用語法的詳細資訊,請按一下各函數連結。
Date 函數可在運算式中插入目前系統的日期。 常與 Format 函數一起使用,也會搭配含有日期/時間資料之欄位的欄位識別碼。
=Date()DatePart 函式用於確定或擷取日期的一部分——通常是從欄位識別碼取得的日期,但有時則是由其他函式(如 Date)回傳的日期值。
DatePart ( "yyyy", Date())DateDiff 函數用於判斷兩個日期之間的差異——通常是從欄位識別碼取得的日期與使用日期函數取得的日期之間的差異。
=DateDiff("d", Now(), [Orders].[ReceiveBefore])-10Format 函數可用來將格式設定套用至識別碼及其他函數得出的結果。
Format([Date],"ww")=Format(Now(),"ww")-1IIf 函數用於評估表達式為真或假,若表達式為真則回傳一個值,若為假則回傳另一個值。
=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" |
透過使用萬用符 ?運算子和 *來匹配字串值。 |
Like 運算子 |
Between val1 And val2 |
判斷某數字或日期值是否落在範圍內。 | Between...And 運算子 |
In(string1,string2...) |
判斷一組字串值中是否包含某字串值。 | In 運算子 |
常數
常數是一種您可以在運算式中使用,且不會變動的已知值。 Access 中有四種常用的常數:
-
True表示某些邏輯上是正確的。 -
False表示某些邏輯上是錯誤的。 -
Null表示缺乏已知的數值。 -
"" (empty string)表示已知為空的值。
常數可當做函數中的引數,也可用來做為運算式中準則的一部分。 例如,你可以將空字串常數 ("") 作為查詢欄位的條件之一,透過輸入以下條件來評估該欄位的欄位值: <>""。 在此例中, <> 是算符,且 "" 為常數。 放在一起時表示它們會將所套用的識別碼與空字串進行比較。 當識別碼的值為空字串以外的任何其他值時,運算式的結果為 True。
使用 Null 常數時要小心。 在大多數情況下, Null 與比較運算子一起使用會導致錯誤。 如果你想在表達式中比較 與 的 Null 值,可以使用 Is Null 或 運算 Is Not Null 子。
值
您可以在運算式中使用常值,例如數字 1,254 或字串「輸入一個 1 到 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 網頁資料庫中使用任何此類表達式。 你不會收到任何錯誤訊息——這個表達式根本無法運作。
使用、 &AND和 OR 運算子可以在伺服器上產生額外的巢狀層級,這些層級在 Access 用戶端中未被反映出來。 例如,表達式 "a" & "b" & "c" 在表達式建構器中沒有巢狀,但在 SharePoint 中它變成 concatenate.Db("a", concatenate.Db("b", "c") )了。 這項轉譯會建立一個層級的巢狀結構。 在同一表達式中使用多個連續&的 、 或 ANDOR 運算子,可能會導致你超過伺服器巢狀限制 65,屆時該表達式在瀏覽器中無法運作。