使用 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]
在某些情况下,元素名称本身可用作标识符。 当元素在所创建表达式的上下文中具有唯一性时即为如此。 上下文暗含标识符的其余部分。 例如,如果设计的查询只使用一个表,字段名称可单独用作标识符,因为表中的字段名称在该表中必须是唯一的。 由于只使用了一个表,在查询中用于引用字段的任何标识符中都暗含了表名。
在其他情况下,必须明确标识符的各个部分,以便引用正常运行。 当标识符在表达式的上下文中并非唯一时即为如此。 具有多义性时,必须显式指示足够的标识符组成部分,使其在上下文中具有唯一性。 例如,假设要设计的查询使用了名为“产品”的表和名为“订单”的表,而且两个表都有名为 ProductID 的字段。 在这种情况下,在查询中用于引用任一 ProductID 字段的标识符除了包含字段名称外,还必须包含表格名称。 例如:
[Products]![ProductID]
标识符运算符 在标识符中可以使用三个运算符:
-
感叹号运算符 (!)
-
点运算符 (.)
-
方括号运算符 ([ ])
这些运算符的使用方式是:将标识符的每个部分前后加上方括号,然后使用感叹号或点运算符将这些部分联接在一起。 例如,对于名为 Employees 的表中的 Last Name 字段,其标识符可表示为 [Employees]![Last Name]。 感叹号运算符告知 Access,其后面部分表示的对象属于其前面部分表示的集合。 在此例中,[Last Name] 是属于 [Employees] 集合的字段对象,而后者本身是表对象。
严格地说,不必始终在标识符或部分标识符前后键入方括号。 如果标识符中没有空格或其他特殊字符,Access 在读取表达式时自动添加括号。 但是,最好自己键入括号,这有助于避免错误,并可作为视觉线索,提示表达式的特定部分是标识符。
函数、运算符、常量和值
要创建表达式,不仅需要标识符,还需要执行某种操作。 在表达式中使用函数、运算符和常量执行操作。
函数
函数是可以在表达式中使用的过程。 某些函数(如 Date)不需要任何输入即可工作。 但是,大多数函数需要输入,称为参数。
在本文开头的示例中,DatePart 函数使用两个参数:时间间隔参数(值为 "yyyy")和日期参数(值为 [Customers]![BirthDate])。 DatePart 函数至少需要这两个参数(时间间隔和日期),但最多可接受四个参数。
下面列出了表达式中的一些常用函数。 单击每个函数的链接,了解用于该函数的语法的详细信息。
-
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 |
Expr1 And Expr2 |
Expr1 和 Expr2 为 true 时,则为 true。 |
Or |
Expr1 Or Expr2 |
Expr1 或 Expr2 为 true 时,则为 true。 |
Eqv |
Expr1 Eqv Expr2 |
Expr1 和 Expr2 均为 true 或均为 false 时,则为 true。 |
Not |
Not Expr |
Expr 不为 true 时,则为 true。 |
Xor |
Expr1 Xor Expr2 |
Expr1 为 true 或 Expr2 为 true,但不同时为 true 时,则为 true。 |
连接运算符
使用连接运算符将两个文本值合并到为一个字符串。
运算符 |
用法 |
说明 |
---|---|---|
& |
string1 & string2 |
合并两个字符串,组成一个字符串。 |
+ |
string1 + string2 |
合并两个字符串,组成一个字符串,并传播 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 或字符串“请输入一个介于 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 遇到用 # 字符括起来的有效日期/时间值时,它会自动将该值作为“日期/时间”数据类型处理。
表达式的嵌套限制是 65
嵌套超过 65 层的表达式在浏览器中不起作用,因此不应在 Access Web 数据库中使用任何此类表达式。 你不会获得任何错误消息,但表达式不起作用。
使用 &、AND 和 OR 运算符可以在服务器上创建不反映在 Access 客户端上的其他嵌套层。 例如表达式 "a" & "b" & "c" 未嵌套在表达式生成器中,但在 SharePoint 中将变成 concatenate.Db("a", concatenate.Db("b", "c") )。 此转换将创建一个嵌套层。 在单个表达式中使用多个连续的 &,AND 或 OR 运算符,可能会导致超过服务器 65 层的嵌套限制,此时表达式在浏览器中不起作用。