Snowflake 作為現代雲端資料倉儲,提供強大的 SQL 功能,其中多表更新和字串處理是資料工程師的必備技能。本文將探討這些技巧,並分享一些實務經驗,幫助大家更有效率地操作 Snowflake。首先,多表更新經常涉及 UPDATE...FROM 語法,允許我們根據其他表格的資料更新目標表格。然而,這也潛藏著多重關聯更新的風險,也就是目標表格的一列可能比對多列來源表格資料,導致更新結果不確定。為避免這種情況,我們可以設定 error_on_nondeterministic_update 引數為 true,讓 Snowflake 在偵測到多重關聯更新時丟擲錯誤,確保資料一致性。

除了 UPDATE...FROM,Snowflake 的 MERGE 陳述式更是一大利器,它整合了 INSERTUPDATEDELETE 操作,簡化了資料同步流程。MERGE 陳述式的 WHEN MATCHEDWHEN NOT MATCHED 子句,讓我們能根據比對條件執行不同的操作,例如更新比對的列、插入不比對的列,甚至刪除符合特定條件的列。這在處理複雜的資料同步場景時非常有用,例如將更新資料整合到主表格,同時移除過時的資料。

在資料清理方面,Snowflake 提供了豐富的字串函式,例如 LTRIMRTRIMTRIM,用於移除字串頭尾的空白字元。TRANSLATE 函式則能移除或替換特定字元,例如清理電話號碼中的格式化符號。此外,POSITIONSUBSTR 函式則能精準定位和提取字串片段,方便我們擷取所需的資訊。

最後,STARTSWITHENDSWITHCONTAINS 函式則提供了字串判斷功能,讓我們能快速判斷字串是否符合特定模式,例如檢查檔案名稱是否符合特定格式,或是篩選包含特定關鍵字的文字內容。這些函式在資料清理和轉換過程中扮演著重要的角色,能有效提升資料品質和分析效率。

Snowflake UPDATE 進階:掌握多表更新與避免非預期行為

在資料倉管理中,UPDATE 指令是用於修改現有資料的關鍵工具。然而,當涉及到多個表格之間的關聯更新時,事情可能會變得複雜。身為一個資料函式庫愛好者,玄貓將分享一些在 Snowflake 中使用 UPDATE 指令的經驗,特別是如何處理多表更新以及避免潛在的非預期行為。

多表更新:甜蜜的複雜

有時候,你需要根據另一個表格的資料來更新目標表格。在 Snowflake 中,這可以透過 UPDATE ... FROM 語法來實作。例如,假設我們想根據 Employee 表格來更新 Person 表格中的 occupation 欄位:

-- 範例:根據 Employee 表格更新 Person 表格的 occupation 欄位
UPDATE Person AS p
SET p.occupation = 'boss'
FROM Employee AS e
WHERE p.first_name = e.first_name
  AND p.last_name = e.last_name
  AND e.mgr_empid IS NULL;

內容解密

  • 這個範例中,我們將 Person 表格的別名設為 pEmployee 表格的別名設為 e
  • WHERE 子句定義了更新的條件:Person 表格中的 first_namelast_name 必須與 Employee 表格中的相符,與 Employee 表格中的 mgr_empid 必須為 NULL(表示該員工沒有經理,可能是老闆)。
  • SET 子句指定了要更新的欄位:將 Person 表格中符合條件的列的 occupation 欄位設定為 'boss'

執行上述 SQL 陳述式後,如果 Employee 表格中存在 mgr_empidNULL,與姓名與 Person 表格相符的紀錄,Person 表格中對應的 occupation 欄位就會被更新為 'boss'

更新後,可以查詢 Person 表格來驗證結果:

-- 範例:查詢 Person 表格,確認 occupation 欄位是否已更新
SELECT first_name, last_name, occupation
FROM Person;

多重關聯的風險與防範

UPDATE 陳述式中的 WHERE 子句導致 Person 表格中的一列與 Employee 表格中的多列比對時,就會發生「多重關聯更新」。這可能會導致非預期的結果,因為 Snowflake 會選擇其中一列來進行更新,但你無法控制選擇哪一列。

例如:

-- 範例:可能導致多重關聯更新的 UPDATE 陳述式
UPDATE Person AS p
SET p.years_of_education = e.empid - 1000
FROM Employee AS e
WHERE e.empid < 1003;

內容解密

  • 這個範例中,我們試圖根據 Employee 表格的 empid 來更新 Person 表格的 years_of_education 欄位。
  • WHERE 子句 e.empid < 1003 導致 Person 表格中的每一列都與 Employee 表格中的多列比對(假設有多個 empid 小於 1003)。
  • 這會導致多重關聯更新,Person 表格中的 years_of_education 欄位會被隨機選擇的 Employee 表格中的 empid 值更新。

為了避免這種情況,你可以設定 error_on_nondeterministic_update 引數為 true。這樣,當 Snowflake 偵測到多重關聯更新時,就會丟擲錯誤:

-- 範例:設定 error_on_nondeterministic_update 引數
ALTER SESSION SET error_on_nondeterministic_update = TRUE;

-- 再次執行可能導致多重關聯更新的 UPDATE 陳述式
UPDATE Person AS p
SET p.years_of_education = e.empid - 1000
FROM Employee AS e
WHERE e.empid < 1003;

內容解密

  • ALTER SESSION SET error_on_nondeterministic_update = TRUE; 陳述式會將 error_on_nondeterministic_update 引數設定為 true,這會影響當前會話中的所有後續 UPDATE 陳述式。
  • 當 Snowflake 偵測到多重關聯更新時,會丟擲一個錯誤,指出存在重複的列。

資料合併:整合變更的利器

除了單純的 UPDATE 陳述式,Snowflake 還提供了 MERGE 陳述式,它允許你將 INSERTUPDATEDELETE 操作合併到一個陳述式中。這在需要同步兩個表格的資料時非常有用。

假設我們有一個名為 Person_Refresh 的表格,其中包含對 Person 表格的更新。Person_Refresh 表格有一個名為 remove 的欄位,用於指示是否應從 Person 表格中刪除相應的列。

首先,建立 Person_Refresh 表格並插入一些資料:

-- 範例:建立 Person_Refresh 表格並插入資料
CREATE TABLE Person_Refresh AS
SELECT *
FROM (
    VALUES
        ('Bob', 'Smith', 'no', '22-JAN-2000', 'blue', 'manager'),
        ('Gina', 'Peters', 'no', '03-MAR-2001', 'brown', 'student'),
        ('Tim', 'Carpenter', 'no', '09-JUL-2002', 'green', 'salesman'),
        ('Carl', 'Langford', 'no', '16-JUN-2001', 'blue', 'tailor'),
        ('Sharon', 'Carpenter', 'yes', NULL, NULL, NULL),
        ('Kathy', 'Little', 'yes', NULL, NULL, NULL)
) AS hr_list (fname, lname, remove, dob, eyes, profession);

內容解密

  • CREATE TABLE Person_Refresh AS 陳述式會建立一個名為 Person_Refresh 的新表格,並從 SELECT 陳述式的結果中插入資料。
  • VALUES 子句指定了要插入的資料,每一列代表一個人的資訊。
  • AS hr_list (fname, lname, remove, dob, eyes, profession) 子句為每一列指定了欄位名稱。

然後,使用 MERGE 陳述式將 Person_Refresh 表格中的變更應用到 Person 表格:

-- 範例:使用 MERGE 陳述式同步 Person 表格和 Person_Refresh 表格
MERGE INTO Person AS p
USING Person_Refresh AS pr
ON p.first_name = pr.fname
  AND p.last_name = pr.lname
WHEN MATCHED AND pr.remove = 'yes' THEN
    DELETE
WHEN MATCHED THEN
    UPDATE
    SET p.birth_date = pr.dob,
        p.eye_color = pr.eyes,
        p.occupation = pr.profession
WHEN NOT MATCHED THEN
    INSERT (first_name, last_name, birth_date, eye_color, occupation)
    VALUES (pr.fname, pr.lname, pr.dob, pr.eyes, pr.profession);

內容解密

  • MERGE INTO Person AS p USING Person_Refresh AS pr 子句指定了目標表格(Person)和來源表格(Person_Refresh),並為它們指定了別名。
  • ON p.first_name = pr.fname AND p.last_name = pr.lname 子句指定了合併的條件:Person 表格和 Person_Refresh 表格中 first_namelast_name 相同的列被認為是比對的。
  • WHEN MATCHED AND pr.remove = 'yes' THEN DELETE 子句指定了當列比對與 Person_Refresh 表格中的 remove 欄位為 'yes' 時,從 Person 表格中刪除該列。
  • WHEN MATCHED THEN UPDATE SET ... 子句指定了當列比對時,更新 Person 表格中的 birth_dateeye_coloroccupation 欄位。
  • WHEN NOT MATCHED THEN INSERT ... 子句指定了當 Person_Refresh 表格中的列在 Person 表格中沒有比對項時,將該列插入到 Person 表格中。

MERGE 陳述式是一個強大的工具,可以簡化資料同步的過程。透過將 INSERTUPDATEDELETE 操作合併到一個陳述式中,你可以減少程式碼的複雜性,並提高資料同步的效率。

總之,理解 Snowflake 中 UPDATEMERGE 陳述式的運作方式,可以幫助你更有效地管理資料,並避免潛在的錯誤。希望這些經驗分享對你有所幫助。

資料合併的藝術:Snowflake 的 MERGE 指令深度解析

在資料倉管理中,經常需要同步或合併來自不同來源的資料。Snowflake 提供的 MERGE 指令,就像一位精明的資料整合專家,能讓我們輕鬆完成這項任務。今天,玄貓就帶大家深入瞭解 MERGE 指令的奧妙。

MERGE 指令的基本結構

MERGE 指令的核心在於將目標表(target table)與來源表(source table)進行比對,並根據比對結果執行不同的操作,例如更新、插入或刪除。

其基本結構如下:

merge into 目標表名 as t
using 來源表名 as s
on t.目標表欄位 = s.來源表欄位
when matched then
  update set
    t.欄位1 = s.欄位1,
    t.欄位2 = s.欄位2
when not matched then
  insert (欄位1, 欄位2) values (s.欄位1, s.欄位2);

程式碼解密

  • merge into 目標表名 as t:指定要修改的目標表,並給予別名 t
  • using 來源表名 as s:指定提供新值的來源表,並給予別名 s
  • on t.目標表欄位 = s.來源表欄位:描述來源表如何與目標表進行連線(join)。這個 on 子句定義了比對的條件。
  • when matched then update set ...:對於目標表和來源表中都存在的列,when matched 子句描述瞭如何修改目標表中的列。
  • when not matched then insert ...:對於只存在於來源表而不在目標表中的列,when not matched 子句描述瞭如何插入新的列。

實戰演練:人員資料同步

假設我們有一個 Person 表,用於儲存人員的基本資料,現在我們需要從 Person_Refresh 表同步最新的資料。

-- 示範資料表結構
CREATE TABLE Person (
  first_name VARCHAR(50),
  last_name VARCHAR(50),
  birth_date DATE,
  eye_color VARCHAR(10),
  occupation VARCHAR(50)
);

CREATE TABLE Person_Refresh (
  fname VARCHAR(50),
  lname VARCHAR(50),
  dob DATE,
  eyes VARCHAR(10),
  profession VARCHAR(50)
);

-- 範例資料
INSERT INTO Person VALUES
('Gina', 'Peters', '2001-03-03', 'brown', 'student'),
('Tim', 'Carpenter', '2002-07-09', 'green', 'student'),
('Kathy', 'Little', '1999-12-20', 'blue', 'teacher'),
('Bob', 'Smith', '2000-01-22', 'blue', 'manager'),
('Sharon', 'Carpenter', '2001-08-18', 'brown', 'engineer');

INSERT INTO Person_Refresh VALUES
('Gina', 'Peters', '2001-03-03', 'brown', 'student'),
('Tim', 'Carpenter', '2002-07-09', 'green', 'salesman'),
('Carl', 'Langford', '2001-06-16', 'blue', 'tailor'),
('Bob', 'Smith', '2000-01-22', 'blue', 'manager'),
('Sharon', 'Carpenter', '2001-08-18', 'brown', 'engineer');

程式碼解密

上述程式碼首先建立了兩個資料表:PersonPerson_RefreshPerson 表儲存了現有的人員資料,而 Person_Refresh 表則包含了需要同步的最新資料。

接下來,我們使用 MERGE 指令來同步這兩個表的資料:

merge into Person as p
using Person_Refresh as pr
on p.first_name = pr.fname and p.last_name = pr.lname
when matched then update set
p.birth_date = pr.dob,
p.eye_color = pr.eyes,
p.occupation = pr.profession
when not matched then insert
(first_name, last_name, birth_date, eye_color, occupation)
values (pr.fname, pr.lname, pr.dob,
pr.eyes, pr.profession);

程式碼解密

  • merge into Person as p:指定 Person 表為目標表,別名為 p
  • using Person_Refresh as pr:指定 Person_Refresh 表為來源表,別名為 pr
  • on p.first_name = pr.fname and p.last_name = pr.lname:指定連線條件為 first_namelast_name 都相同。
  • when matched then update set ...:當 Person 表和 Person_Refresh 表中 first_namelast_name 都相同的列時,更新 birth_dateeye_coloroccupation 欄位。
  • when not matched then insert ...:當 Person_Refresh 表中有,但 Person 表中沒有的列時,將該列插入到 Person 表中。

執行完畢後,Snowflake 會回應插入、更新和刪除的列數。

MERGE 指令的注意事項

  • when 子句的順序很重要,Snowflake 會從上到下評估這些子句。
  • MERGE 指令可以包含多個 when matchedwhen not matched 子句,以處理更複雜的資料同步邏輯。

字串處理的魔法:Snowflake 內建函式

字串是資料函式庫中常見的資料型別,Snowflake 提供了豐富的內建函式,讓玄貓們可以輕鬆地對字串進行各種操作。

字串串連:|| 運算元和 concat() 函式

要將兩個或多個字串連線在一起,可以使用 || 運算元或 concat() 函式。

select 'string 1' || ' and ' || 'string2';

select concat('string1',' and ','string2');

程式碼解密

這兩個語法的作用相同,都是將 'string 1'' and ''string2' 這三個字串連線在一起,結果為 'string 1 and string2'

特殊字元:char() 函式

有時候,我們需要在字串中包含鍵盤上沒有的字元,這時可以使用 char() 函式,透過 ASCII 碼來表示字元。

select concat('I spent ',char(8364),'357 in Paris');

程式碼解密

char(8364) 代表歐元符號 ,因此這段程式碼的輸出結果為 'I spent €357 in Paris'

大小寫轉換:upper()lower()initcap() 函式

Snowflake 提供了 upper()lower()initcap() 函式,分別用於將字串轉換為全大寫、全小寫和首字母大寫。

select upper(str.val), lower(str.val), initcap(str.val)
from (values ('which case is best?'))
as str(val);

程式碼解密

  • upper(str.val) 將字串 'which case is best?' 轉換為全大寫,結果為 'WHICH CASE IS BEST?'
  • lower(str.val) 將字串 'which case is best?' 轉換為全小寫,結果為 'which case is best?'
  • initcap(str.val) 將字串 'which case is best?' 轉換為首字母大寫,結果為 'Which Case Is Best?'

字串反轉:reverse() 函式

想要將字串反轉?reverse() 函式可以幫你輕鬆實作。

select reverse('?siht daer uoy nac');

程式碼解密

reverse('?siht daer uoy nac') 將字串 '?siht daer uoy nac' 反轉,結果為 'can you read this?'

資料清理:字串的頭尾修剪藝術

在資料倉管理中,字串資料的清理是不可或缺的一環。有時候,我們從外部系統匯入的資料,可能因為格式不一致,在字串的頭尾多了一些不必要的空白。這些空白不僅影響資料的呈現,更可能在後續的資料分析中造成困擾。

Snowflake 提供了 LTRIM()RTRIM()TRIM() 這三個函式,讓我們可以輕鬆地修剪字串的頭尾空白。LTRIM() 用於移除字串開頭的空白,RTRIM() 則移除字串結尾的空白,而 TRIM() 則同時移除字串頭尾的空白。

舉個例子,假設我們有一個包含多餘空白的字串 ' abc ',使用這三個函式的效果如下:

SELECT
    LTRIM(str.val),
    RTRIM(str.val),
    TRIM(str.val)
FROM
    (VALUES (' abc ')) AS str(val);

執行結果會是:

+
---
-
---
-
---
-
---
-+
---
-
---
-
---
-
---
-+
---
-
---
-
---
-
---
+
| LTRIM(STR.VAL) | RTRIM(STR.VAL) | TRIM(STR.VAL) |
|
---
-
---
-
---
-
---
-+
---
-
---
-
---
-
---
-+
---
-
---
-
---
-
---
|
| abc            | abc            | abc           |
+
---
-
---
-
---
-
---
-+
---
-
---
-
---
-
---
-+
---
-
---
-
---
-
---
+

雖然從視覺上可能難以分辨,但我們可以透過 LENGTH() 函式來確認 LTRIM()TRIM() 函式實際上傳回了不同的字串長度:

SELECT
    LENGTH(LTRIM(str.val)) AS str1_len,
    LENGTH(RTRIM(str.val)) AS str2_len,
    LENGTH(TRIM(str.val)) AS str3_len
FROM
    (VALUES (' abc ')) AS str(val);

結果如下:

+
---
-
---
---
+
---
-
---
---
+
---
-
---
---
+
| STR1_LEN | STR2_LEN | STR3_LEN |
|
---
-
---
---
+
---
-
---
---
+
---
-
---
---
|
| 7        | 7        | 3        |
+
---
-
---
---
+
---
-
---
---
+
---
-
---
---
+

從結果可以清楚看到,TRIM() 函式成功移除了字串頭尾的空白,使得字串長度變為 3,而 LTRIM()RTRIM() 僅移除單側空白,長度為7。

進階應用:使用 TRANSLATE() 移除或替換特定字元

除了修剪空白,有時候我們還需要移除或替換字串中的特定字元。這時,TRANSLATE() 函式就派上用場了。

TRANSLATE() 函式可以將字串中出現的某些字元替換成其他字元,或者直接移除。例如,我們可以利用它來移除電話號碼中的格式化字元:

SELECT TRANSLATE('(857)-234-5678', '()-', '');

執行結果:

+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
---
+
| TRANSLATE('(857)-234-5678','()-','') |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
---
|
| 8572345678                           |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
---
+

這個例子中,我們將電話號碼中的 ()- 字元都替換成空字串,相當於直接移除了這些字元。

TRANSLATE() 函式也可以用來進行字元替換。例如,將字串 'AxByCz' 中的 A 替換成 XB 替換成 YC 替換成 Z

SELECT TRANSLATE('AxByCz', 'ABC', 'XYZ');

結果如下:

+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
--+
| TRANSLATE('AxByCz','ABC','XYZ') |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
--|
| XxYyZz                            |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
--+

字串搜尋與提取:精準定位,擷取所需

在處理字串資料時,有時我們需要找出特定子字串在字串中的位置,或者提取字串中的某一部分。Snowflake 提供了 POSITION()SUBSTR() 函式,讓我們可以輕鬆完成這些任務。

POSITION() 函式用於找出子字串在字串中的位置。它接受兩個必要的引數:要搜尋的子字串和目標字串。此外,還可以指定一個可選的起始位置,讓搜尋從字串的特定位置開始。如果找不到子字串,POSITION() 函式會傳回 0。

例如:

SELECT
    POSITION('here', str.val) AS pos1,
    POSITION('here', str.val, 10) AS pos2,
    POSITION('nowhere', str.val) AS pos3
FROM
    (VALUES ('here, there, and everywhere')) AS str(val);

執行結果:

+
---
---
+
---
---
+
---
---
+
| POS1 | POS2 | POS3 |
|
---
---
+
---
---
+
---
---
|
| 1    | 24   | 0    |
+
---
---
+
---
---
+
---
---
+

在這個例子中,POSITION('here', str.val) 傳回 1,表示子字串 'here' 在字串 'here, there, and everywhere' 中的起始位置是 1。POSITION('here', str.val, 10) 傳回 24,因為我們指定搜尋從位置 10 開始,所以找到的下一個 'here' 的位置是 24。而 POSITION('nowhere', str.val) 傳回 0,因為子字串 'nowhere' 並不存在於目標字串中。

SUBSTR() 函式則用於提取字串中的一部分。它接受三個引數:目標字串、起始位置和要提取的字元數。如果省略第三個引數,SUBSTR() 函式會提取從起始位置到字串結尾的所有字元。

例如:

SELECT
    SUBSTR(str.val, 1, 10) AS start_of_string,
    SUBSTR(str.val, 11) AS rest_of_string
FROM
    (VALUES ('beginning ending')) AS str(val);

執行結果:

+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+
| START_OF_STRING | REST_OF_STRING |
|
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-|
| beginning       | ending         |
+
---
-
---
-
---
-
---
--+
---
-
---
-
---
-
---
-+

這個例子中,SUBSTR(str.val, 1, 10) 提取了字串 'beginning ending' 的前 10 個字元,傳回 'beginning'SUBSTR(str.val, 11) 提取了從位置 11 到字串結尾的所有字元,傳回 'ending'

POSITION() 函式和 SUBSTR() 函式常常一起使用,以實作更靈活的字串提取。例如,我們可以先使用 POSITION() 函式找出特定子字串的位置,然後使用 SUBSTR() 函式提取該子字串之後的所有字元:

SELECT
    SUBSTR(str.val, POSITION('every', str.val))
FROM
    (VALUES ('here, there, and everywhere')) AS str(val);

執行結果:

+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-+
| SUBSTR(STR.VAL, POSITION('EVERY',STR.VAL)) |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-|
| everywhere                                 |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-+

在這個例子中,POSITION('every', str.val) 傳回 18,表示子字串 'every' 在字串 'here, there, and everywhere' 中的位置是 18。然後,SUBSTR(str.val, 18) 提取了從位置 18 到字串結尾的所有字元,傳回 'everywhere'

字串判斷:STARTSWITH()ENDSWITH()CONTAINS()

除了搜尋子字串的位置,有時我們只需要判斷一個字串是否以特定的子字串開頭、結尾或包含特定的子字串。Snowflake 提供了 STARTSWITH()ENDSWITH()CONTAINS() 這三個函式,可以滿足這些需求。

這三個函式都傳回布林值:如果字串符合條件,則傳回 TRUE,否則傳回 FALSE

例如:

SELECT str.val
FROM (VALUES ('here, there, and everywhere')) AS str(val)
WHERE STARTSWITH(str.val, 'here');

執行結果:

+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+
| VAL                         |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
--|
| here, there, and everywhere |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+

這個例子中,STARTSWITH(str.val, 'here') 傳回 TRUE,因為字串 'here, there, and everywhere' 以子字串 'here' 開頭。

SELECT str.val
FROM (VALUES ('here, there, and everywhere')) AS str(val)
WHERE ENDSWITH(str.val, 'where');

執行結果:

+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+
| VAL                         |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
--|
| here, there, and everywhere |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+

這個例子中,ENDSWITH(str.val, 'where') 傳回 TRUE,因為字串 'here, there, and everywhere' 以子字串 'where' 結尾。

SELECT str.val
FROM (VALUES ('here, there, and everywhere')) AS str(val)
WHERE CONTAINS(str.val, 'there');

執行結果:

+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+
| VAL                         |
|
---
-
---
-
---
-
---
-
---
-
---
-
---
--|
| here, there, and everywhere |
+
---
-
---
-
---
-
---
-
---
-
---
-
---
--+

這個例子中,CONTAINS(str.val, 'there') 傳回 TRUE,因為字串 'here, there, and everywhere' 包含子字串 'there'

數值資料處理:簡單運算與內建函式

數值資料的產生相對簡單,可以直接輸入數字、從資料表欄位中取得,或者使用算術運算元 +-*/ 進行計算。

例如:

SELECT
    10 AS radius,
    2 * 3.14159 * 10 AS circumference;

執行結果:

+
---
-
---
-+
---
-
---
-
---
-
---
+
| RADIUS | CIRCUMFERENCE |
|
---
-
---
-+
---
-
---
-
---
-
---
|
| 10     | 62.83180      |
+
---
-
---
-+
---
-
---
-
---
-
---
+

在這個例子中,我們計算了半徑為 10 的圓的周長。

可以使用括號來控制計算的優先順序:

SELECT (3 * 6) - (10 / 2);

執行結果:

+
---
-
---
-
---
-
---
-
---
-+
| (3 * 6) - (10 / 2) |
|
---
-
---
-
---
-
---
-
---
-|
| 13.000000          |
+
---
-
---
-
---
-
---
-
---
-+

對於更複雜的計算,Snowflake 提供了許多內建的數值函式。玄貓將在後續的文章中為大家詳細介紹這些函式。

總而言之,Snowflake 提供了豐富的字串和數值資料處理函式,讓我們可以輕鬆地對資料進行清理、轉換和分析。掌握這些函式,將能大幅提升資料處理的效率和準確性。