条件表达式函数使用传递给函数的每个表达式,根据逻辑操作返回值。例如,BOOLOR函数接受两个数值表达式,如果其中一个(或两个)表达式的计算结果为True(非零)值,则返回True。
[ NOT ] BETWEEN
<expr> [ NOT ] BETWEEN <lower_bound> AND <upper_bound>
计算规则:表达式A BETWEEN X AND Y等效于A>=X AND A<=Y。用于与X和Y进行比较的排序规则是独立的,不需要相同,但两者都需要与A的排序规则兼容。
返回值:当输入表达式(数字或字符串)在指定的上下边界内时,返回TRUE。
样例:
下面是一些简单的示例,说明如何将BETWEEN与数字值和字符串值一起使用:
select 'true' where 1 between 0 and 10;
select 'true' where 1.35 between 1 and 2;
select 'true' where 'the' between 'that' and 'then';
以下示例将COLLATE与BETWEEN一起使用:
select 'm' between collate('A', 'lower') and collate('Z', 'lower');
select collate('m', 'upper') between 'A' and 'Z';
BOOLAND
BOOLAND( expr1 , expr2 )
返回值:计算两个数值表达式的布尔AND。根据布尔语义:非零值(包括负数)视为True。零值被视为False。因此,函数返回:如果两个表达式都为非零,则为True。
如果两个表达式都为零,或一个表达式为零,而另一个表达式非零或为NULL,则为False。
如果两个表达式都为NULL,或一个表达式为NULL而另一个表达式不为零,则返回NULL。
样例:
下面是一些简单的示例:
select booland(1, -2), booland(0, 2.35), booland(0, 0), booland(0, null), booland(null, 3), booland(null, null);
BOOLNOT
BOOLNOT( expr )
返回值:计算单个数值表达式的布尔NOT。根据布尔语义:非零值(包括负数)视为True。零值被视为False。
因此,函数返回:
如果表达式为零,则为True。
如果表达式为非零,则为False。
如果表达式为NULL,则返回NULL。
样例:
下面是一些简单的示例:
select boolnot(0), boolnot(10), boolnot(-3.79), boolnot(null);
BOOLOR
BOOLOR( expr1 , expr2 )
返回值:计算两个数值表达式的布尔OR。根据布尔语义:非零值(包括负数)视为True。零值被视为False。
因此,函数返回:
如果两个表达式都为非零,或一个表达式为非零而另一个表达式是零或NULL,则为True。
如果两个表达式都为零,则为False。
如果两个表达式都为NULL,者一个表达式为NULL而另一个表达式则为零,则返回NULL。
样例:
下面是一些简单的示例:
select boolor(1, 2), boolor(-1.35, 0), boolor(3, null), boolor(0, 0), boolor(null, 0), boolor(null, null);
BOOLXOR
BOOLXOR( expr1 , expr2 )
返回值:计算两个数值表达式的布尔异或(即其中一个表达式,但不是两个表达式都为TRUE)。根据布尔语义:非零值(包括负数)视为True。零值被视为False。
因此,函数返回:
如果一个表达式为非零,而另一个表达式则为零,则为True。
如果两个表达式都为非零或都为零,则为False。
如果一个或两个表达式都为NULL,则返回NULL。
样例:
下面是一些简单的示例:
select boolxor(2, 0), boolxor(1, -1), boolxor(0, 0), boolxor(null, 3), boolxor(null, 0), boolxor(null, null);
CASE
CASE
WHEN <condition1> THEN <result1>
[ WHEN <condition2> THEN <result2> ]
[ ... ]
[ ELSE <result3> ]
END
CASE <expr>
WHEN <value1> THEN <result1>
[ WHEN <value2> THEN <result2> ]
[ ... ]
[ ELSE <result3> ]
END
工作方式类似于级联的“if-then-else”语句。在更一般的形式中,按顺序评估一系列条件。当条件的计算结果为TRUE时,计算将停止,并返回关联的结果(在THEN之后)。如果没有任何条件计算为TRUE,则返回可选ELSE之后的结果(如果存在);否则返回NULL。
在第二种“速记”形式中,CASE后面的表达式与顺序中的每个WHEN表达式进行比较,直到其中一个匹配为止;然后返回关联的结果(在then之后)。如果所有表达式都不匹配,则返回可选ELSE之后的结果(如果存在);否则返回NULL。
请注意,在第二种形式中,NULL CASE表达式与任何WHEN表达式都不匹配,即使其中一个WHEN表达式也为NULL。
参数:
condition:在第一种形式的CASE中,每个条件都是一个表达式,其计算结果应为BOOLEAN值(True、False或NULL)。
expr:通用表达式。
value:在CASE的第二种形式中,每个值都可能与expr匹配。该值可以是文本或表达式。该值必须与表达式的数据类型相同,或者必须是可以转换为表达式数据类型的数据类型。
result:在CASE子句的第一种形式中,如果condition为true,则函数返回相应的result。如果有多个条件为true,则返回与第一个true条件关联的结果。
在CASE语句的第二种形式中,如果value与expr匹配,则返回相应的结果。如果有多个值与表达式匹配,则返回第一个匹配值的结果。
结果应该是一个计算结果为单个值的表达式。
在这两种形式的CASE中,如果存在可选的ELSE子句,并且没有找到匹配项,那么函数将在ELSE子句中返回结果。如果不存在ELSE子句,并且找不到匹配项,则结果为NULL。
用法注解:请注意,与DECODE相反,条件中的NULL值与条件中其他地方的NULL数值不匹配。例如,WHEN <null_expr> = NULL THEN 'Return me!' ,”不返回“Return me!”。如果要与NULL值进行比较,请使用IS NULL而不是=NULL。
condition、expr、value和result都可以是通用表达式,因此可以包含包含集合运算符的子查询,例如UNION、INTERSECT、EXCEPT和MINUS。使用集合运算符时,请确保数据类型兼容。有关详细信息,请参阅设置运算符主题中的常规用法注释。
样例:
这展示CASE的典型用法:
select
column1,
case
when column1=1 then 'one'
when column1=2 then 'two'
else 'other'
end as result
from (values(1),(2),(3)) v;
下面展示,如果所有值都不匹配,并且没有ELSE子句,则返回的值为NULL:
select
column1,
case
when column1=1 then 'one'
when column1=2 then 'two'
end as result
from (values(1),(2),(3)) v;
此示例显式处理NULL。
select
column1,
case
when column1 = 1 then 'one'
when column1 = 2 then 'two'
when column1 is null then 'NULL'
else 'other'
end as result
from values (1), (2), (null);
以下示例结合了CASE和排序规则:
select case collate('m', 'upper')
when 'M' then true
else false
end;
select case 'm'
when collate('M', 'lower') then true
else false
end;
COALESCE
COALESCE( <expr1> , <expr2> [ , ... , <exprN> ] )
所有输入参数的排序规则规范必须兼容。
这些比较遵循基于输入参数排序规则和优先顺序的排序规则。
函数结果的排序规则是输入的最高优先级排序规则。
返回值:返回参数中的第一个非NULL表达式,如果所有参数都为NULL,则返回NULL。
用法注解:如果可能,请传入相同类型的参数。避免传入不同类型的参数。如果其中一个参数是数字,则函数将非数字字符串参数(例如“字符串”)和非常量的字符串参数强制为number(18,5)类型。对于非常量的数值字符串参数,如果NUMBER(18,5)不足以表示数值,则应将该参数强制转换为可以表示该值的类型。
样例:
select column1, column2, column3, coalesce(column1, column2, column3)
from (values
(1, 2, 3 ),
(null, 2, 3 ),
(null, null, 3 ),
(null, null, null),
(1, null, 3 ),
(1, null, null),
(1, 2, null)
) v;