天天看点

SnowFlake数据仓库的操作条件表达式函数(上)

作者:搞数据的

条件表达式函数使用传递给函数的每个表达式,根据逻辑操作返回值。例如,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;           
SnowFlake数据仓库的操作条件表达式函数(上)
select 'true' where 1.35 between 1 and 2;           
SnowFlake数据仓库的操作条件表达式函数(上)
select 'true' where 'the' between 'that' and 'then';           
SnowFlake数据仓库的操作条件表达式函数(上)

以下示例将COLLATE与BETWEEN一起使用:

select 'm' between collate('A', 'lower') and collate('Z', 'lower');           
SnowFlake数据仓库的操作条件表达式函数(上)
select collate('m', 'upper') between 'A' and 'Z';           
SnowFlake数据仓库的操作条件表达式函数(上)

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);           
SnowFlake数据仓库的操作条件表达式函数(上)

BOOLNOT

BOOLNOT( expr )           

返回值:计算单个数值表达式的布尔NOT。根据布尔语义:非零值(包括负数)视为True。零值被视为False。

因此,函数返回:

如果表达式为零,则为True。

如果表达式为非零,则为False。

如果表达式为NULL,则返回NULL。

样例:

下面是一些简单的示例:

select boolnot(0), boolnot(10), boolnot(-3.79), boolnot(null);           
SnowFlake数据仓库的操作条件表达式函数(上)

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);           
SnowFlake数据仓库的操作条件表达式函数(上)

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);           
SnowFlake数据仓库的操作条件表达式函数(上)

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;           
SnowFlake数据仓库的操作条件表达式函数(上)

下面展示,如果所有值都不匹配,并且没有ELSE子句,则返回的值为NULL:

select
    column1,
    case
        when column1=1 then 'one'
        when column1=2 then 'two'
    end as result
from (values(1),(2),(3)) v;           
SnowFlake数据仓库的操作条件表达式函数(上)

此示例显式处理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);           
SnowFlake数据仓库的操作条件表达式函数(上)

以下示例结合了CASE和排序规则:

select case collate('m', 'upper')
    when 'M' then true
    else false
end;           
SnowFlake数据仓库的操作条件表达式函数(上)
select case 'm'
    when collate('M', 'lower') then true
    else false
end;           
SnowFlake数据仓库的操作条件表达式函数(上)

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;           
SnowFlake数据仓库的操作条件表达式函数(上)

继续阅读