Snowflake 作為現代雲端資料倉儲,提供強大的 SQL 功能,其中多表更新和字串處理是資料工程師的必備技能。本文將探討這些技巧,並分享一些實務經驗,幫助大家更有效率地操作 Snowflake。首先,多表更新經常涉及 UPDATE...FROM 語法,允許我們根據其他表格的資料更新目標表格。然而,這也潛藏著多重關聯更新的風險,也就是目標表格的一列可能比對多列來源表格資料,導致更新結果不確定。為避免這種情況,我們可以設定 error_on_nondeterministic_update 引數為 true,讓 Snowflake 在偵測到多重關聯更新時丟擲錯誤,確保資料一致性。
除了 UPDATE...FROM,Snowflake 的 MERGE 陳述式更是一大利器,它整合了 INSERT、UPDATE 和 DELETE 操作,簡化了資料同步流程。MERGE 陳述式的 WHEN MATCHED 和 WHEN NOT MATCHED 子句,讓我們能根據比對條件執行不同的操作,例如更新比對的列、插入不比對的列,甚至刪除符合特定條件的列。這在處理複雜的資料同步場景時非常有用,例如將更新資料整合到主表格,同時移除過時的資料。
在資料清理方面,Snowflake 提供了豐富的字串函式,例如 LTRIM、RTRIM 和 TRIM,用於移除字串頭尾的空白字元。TRANSLATE 函式則能移除或替換特定字元,例如清理電話號碼中的格式化符號。此外,POSITION 和 SUBSTR 函式則能精準定位和提取字串片段,方便我們擷取所需的資訊。
最後,STARTSWITH、ENDSWITH 和 CONTAINS 函式則提供了字串判斷功能,讓我們能快速判斷字串是否符合特定模式,例如檢查檔案名稱是否符合特定格式,或是篩選包含特定關鍵字的文字內容。這些函式在資料清理和轉換過程中扮演著重要的角色,能有效提升資料品質和分析效率。
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表格的別名設為p,Employee表格的別名設為e。 WHERE子句定義了更新的條件:Person表格中的first_name和last_name必須與Employee表格中的相符,與Employee表格中的mgr_empid必須為NULL(表示該員工沒有經理,可能是老闆)。SET子句指定了要更新的欄位:將Person表格中符合條件的列的occupation欄位設定為'boss'。
執行上述 SQL 陳述式後,如果 Employee 表格中存在 mgr_empid 為 NULL,與姓名與 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 陳述式,它允許你將 INSERT、UPDATE 和 DELETE 操作合併到一個陳述式中。這在需要同步兩個表格的資料時非常有用。
假設我們有一個名為 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_name和last_name相同的列被認為是比對的。WHEN MATCHED AND pr.remove = 'yes' THEN DELETE子句指定了當列比對與Person_Refresh表格中的remove欄位為'yes'時,從Person表格中刪除該列。WHEN MATCHED THEN UPDATE SET ...子句指定了當列比對時,更新Person表格中的birth_date、eye_color和occupation欄位。WHEN NOT MATCHED THEN INSERT ...子句指定了當Person_Refresh表格中的列在Person表格中沒有比對項時,將該列插入到Person表格中。
MERGE 陳述式是一個強大的工具,可以簡化資料同步的過程。透過將 INSERT、UPDATE 和 DELETE 操作合併到一個陳述式中,你可以減少程式碼的複雜性,並提高資料同步的效率。
總之,理解 Snowflake 中 UPDATE 和 MERGE 陳述式的運作方式,可以幫助你更有效地管理資料,並避免潛在的錯誤。希望這些經驗分享對你有所幫助。
資料合併的藝術: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');
程式碼解密
上述程式碼首先建立了兩個資料表:Person 和 Person_Refresh。Person 表儲存了現有的人員資料,而 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_name和last_name都相同。when matched then update set ...:當Person表和Person_Refresh表中first_name和last_name都相同的列時,更新birth_date、eye_color和occupation欄位。when not matched then insert ...:當Person_Refresh表中有,但Person表中沒有的列時,將該列插入到Person表中。
執行完畢後,Snowflake 會回應插入、更新和刪除的列數。
MERGE 指令的注意事項
when子句的順序很重要,Snowflake 會從上到下評估這些子句。MERGE指令可以包含多個when matched和when 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 替換成 X,B 替換成 Y,C 替換成 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 提供了豐富的字串和數值資料處理函式,讓我們可以輕鬆地對資料進行清理、轉換和分析。掌握這些函式,將能大幅提升資料處理的效率和準確性。