值表达式

值表达式。值表达式用在各种语法环境中,比如在 SELECT 命令的目标列表中,在INSERT或UPDATE中用做新的列值,或者在许多命令中的搜索条件中使用。值表达式的结果为标量,这与表表达式(表、联接表或子查询)不同。表达式语法允许对来自基本部分的数值进行算术,逻辑,集合和其它操作的运算。

值表达式是下列内容之一:

一个常量或者文本值.

一个字段引用.

一个位置参数引用,在函数声明体中.

一个操作符调用.

一个函数调用.

一个聚集表达式.

一个类型转换.

一个标量子查询.

(表达式)

字段引用

字段引用值表达式表示对一个字段的引用,这个字段可能来自于一个表, 视图或查询的结果。一个字段可以用下面形式的引用:

correlation.columnname

或者:

correlation.columnname[subscript]

(这里方括弧[ ]意思是按文本出现。)

correlation指定字段的具体来源,可以是一个表的名字(可能是全称), 或者是用FROM子句这样的方法定义的表的别名。但在通常情况下, 在当前查询中所使用的所有表中,通过字段名字就可以唯一确定一个字段, 这时correlation就可以不写,如:

SELECT RELNAME FROM SYS_CLASS;

但如果查询中使用了多个数据源,且要引用的字段在多个数据源中, 就必须使用correlation来具体指定要引用的字段来自于哪个数据源, 如查询:

SELECT SYS_CLASS.OID FROM SYS_CLASS, SYS_ATTRIBUTE
WHERE SYS_CLASS.OID = SYS_ATTRIBUTE.ATTRELID;

中必须使用SYS_CLASS.OID来指定要引用sys_class中的OID字段, 而不是sys_attribute表中的OID字段。

如果引用的字段是一个数组类型, 那么可选的subscript选择该数组中指定的一个或多个元素. 如果没有提供脚标,那么选出整个数组。如:

SELECT PROARGTYPES[0] FROM SYS_PROC;

可以选择其中所有函数的第一个函数的类型。

参数引用

参数引用用于标识一个SQL函数里的一个参数。 通常它用于SQL函数定义语句。参数引用可以有两种形式: 一种是通过参数的位置来引用,另一种是通过参数名来引用。

可以用形如$position的表达式来通过参数位置引用一个参数, 这里position是从1开始编号的,即第一个参数为$1,第二个参数为$2…。

操作符调用

虽然操作符相当多,但总体上可分为双目操作符与单目操作符两种。 双目操作符采用中缀形式调用,如下所示:

op2 ::=

单目操作符可以使用前缀形式调用,如下所示:

op1 ::=

也可以使用后缀形式调用,如下所示:

op1 ::=

操作符调用是将简单表达式组合为复杂表达式的最有用的工具。 最常用的操作符是算术运算操作符,如:

(99 * 65) / 10

由于神通数据库支持所有的算术运算操作符,同时支持众多的数学函数, 因此可以把神通数据库当作一个功能强劲的计算器使用。

在WHERE子句和HAVING子句中,经常使用逻辑操作符组成多个条件。如:

SELECT RELNAME FROM SYS_CLASS
WHERE (RELNAMESPACE = 2200 OR RELOWNER = CURRENT_USER)
AND (RELKIND = 'r' OR RELKIND = 'v' );

将选择出所有公共的表或当前用户拥有的基本表或视图。

若要获得关于操作符的进一步信息,请参见 操作符

函数调用

函数调用的语法是合法函数名字(可能有模式名修饰), 后面跟着在圆括弧里的它的参数列表:

funccall ::=

神通数据库提供了众多的内建系统函数, 若要获得这些函数的详细信息,请参阅 函数

聚集表达式

一个聚集表达式代表一个聚集函数对一个查询选出的行的处理。 一个聚集函数把多个输入缩减为一个输出值,比如给输入求和或平均。 一个聚集表达式的语法是:

aggregate ::=

这里aggregate_name是聚集函数的名称, 而expression是一个本身不包含聚集表达式的任意值表达式。

第一种形式的聚集表达式为所有表达式生成非空值的输入行调用聚集, 若输入中含有空值,则会被忽略,同时服务器将发生警告。第二种形式和第一种一样,因为ALL是缺省值。第三种形式为所有输入行里找到表达式的所有唯一的非空值调用聚集。最后一种形式为每个输入行(不管是空还是非空)调用一次聚集;因为没有声明特定的输入值.通常它只是对count聚集函数有用。

神通数据库支持所有SQL92标准中规定的聚集函数,包括:

  • AVG: 对输入求均值;
  • COUNT: 计算输入的个数;
  • MIN: 求所有输入数据中的最小值;
  • MAX: 求所有输入数据中的最大值;
  • SUM: 对输入求和。

如:

select count(*) from sys_class;

可以获得所有表、视图、索引、序列的总数。

select count(distinct relnamespace)
from sys_class
where relkind = 'r';

可以获得所有至少包含了一个表的schema的总数。

强制类型转换

一个类型转换声明一个从一种数据类型到另外一种数据类型的转换。 在神通数据库中,强制类型转换可以用三种方式表示:

conv_type ::=

强制类型转换只不过不是神通数据库支持的三个类型转换规则中的一种 (关于类型转换的详细信息,请参见 数据类型的强制转化规则 一节), 通常只在源类型与目标类型之前不能进行隐式类型转换时才使用。 由于源类型与目标类型是不兼容的类型, 因此强制类型转换并不能保证对所有的输入都能成功,如:

'1213'::int

是能成功的,结果为整数1213。但:

'abc'::int

则会失败。

标量子查询

一个标量子查询是一个放在圆括弧里的普通SELECT, 它只返回只有一个字段的一行。该SELECT将被执行, 而其单个返回值将在周围的值表达式中使用, 就像使用一个常量或字段引用一样。

若实际运行过程中作为标量子查询的SELECT查询返回超过一行或超过一列, 则会认为是一个错误, 如使用以下的查询得到表T的所有属性只有在当前数据库中 只有一个名为T的表时才能成功:

select attname from sys_attribute
where attrelid = (select oid from sys_class where relname = 'T');

若当前数据库中含有多个名为T的表,则标量子查询 select oid from sys_class where relname = 'T'; 就会返回多行,查询就会失败。

在上述查询中,若子查询不返回行则不算错误;标量结果认为是 NULL,而NULL与任何值都不相等,因此上述查询将返回0行。

标量子查询与普通的子查询一样,也可以引用周围查询的变量。