天天看點

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資料倉庫的操作條件表達式函數(上)

繼續閱讀