運算子和函數 - Amazon Redshift

Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊,請參閱部落格文章

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

運算子和函數

透過 Amazon Redshift,您可以使用運算子和函式,對使用 SUPER 資料的大型資料集執行進階分析。SUPER 資料的運算子和函式為 SQL 建構模組,可對儲存在 Amazon Redshift 資料表中的半結構化資料進行複雜分析和操作。

下列各節將涵蓋在 Amazon Redshift 中使用 SUPER 資料的運算子和函式的語法、範例和最佳實務,以充分發揮半結構化資料的完整潛力。

算術運算子

SUPER 值支援使用動態類型的所有基本算術運算子 +、-、*、/、%。運算的結果類型會保持為 SUPER。對於所有運算子,除了二元運算子 + 之外,輸入運算元必須是數字。否則,Amazon Redshift 傳回 null。當 Amazon Redshift 執行這些運算子且動態類型不會變更時,將保留小數和浮點值之間的差異。但是,當您使用乘法和除法時,小數位數會發生變化。算術溢位仍然會導致查詢錯誤,它們不會變更為 null。如果輸入是數字,則二元運算子 + 執行加法;如果輸入是字串,則執行串連。如果一個運算元是一個字串,而另一個運算元是一個數字,則結果為 null。如果 SUPER 值不是數字,一元前綴運算子 + 和 - 將傳回 null,如以下範例所示:

SELECT (c_orders[0]. o_orderkey + 0.5) * c_orders[0]. o_orderkey / 10 AS math FROM customer_orders_lineitem; math ---------------------------- 1757958232200.1500 (1 row)

動態類型允許 SUPER 中的小數值具有不同的小數位數。Amazon Redshift 會將十進位值視為不同的靜態類型,並允許所有數學運算。Amazon Redshift 會根據運算元的比例,動態計算結果小數位數。如果其中一個運算元是浮點數,則 Amazon Redshift 會將另一個運算元提升為浮點數並產生浮點數結果。

算術函數

Amazon Redshift 支援 SUPER 欄的以下算術函數。如果輸入不是數字,以下項目會傳回 null:

下列範例會使用算術函數來查詢資料:

SELECT x, FLOOR(x), CEIL(x), ROUND(x) FROM ( SELECT (c_orders[0]. o_orderkey + 0.5) * c_orders[0].o_orderkey / 10 AS x FROM customer_orders_lineitem ); x | floor | ceil | round --------------------+---------------+---------------+--------------- 1389636795898.0500 | 1389636795898 | 1389636795899 | 1389636795898

ABS 函數會保留輸入小數的小數位數,而 FLOOR、CEIL。ROUND 會消除輸入小數的小數位數。

陣列函數

Amazon Redshift 支援下列陣列合成和公用程式函式:

您可以使用 ARRAY 函數 (包括其他 SUPER 值),從 Amazon Redshift 資料類型中的值建構 SUPER 陣列。以下範例使用可變參數函數 ARRAY:

SELECT ARRAY(1, c.c_custkey, NULL, c.c_name, 'abc') FROM customer_orders_lineitem c; array ------------------------------------------------------- [1,8401,null,""Customer#000008401"",""abc""] [1,9452,null,""Customer#000009452"",""abc""] [1,9451,null,""Customer#000009451"",""abc""] [1,8251,null,""Customer#000008251"",""abc""] [1,5851,null,""Customer#000005851"",""abc""] (5 rows)

下列範例使用 ARRAY_CONCAT 函數進行陣列串連:

SELECT ARRAY_CONCAT(JSON_PARSE('[10001,10002]'),JSON_PARSE('[10003,10004]')); array_concat ------------------------------------ [10001,10002,10003,10004] (1 row)

下列範例使用 SUBARRAY 函數進行陣列操作,該函數會傳回輸入陣列的子集。

SELECT SUBARRAY(ARRAY('a', 'b', 'c', 'd', 'e', 'f'), 2, 3); subarray --------------- ["c","d","e"] (1 row))

下列範例使用 ARRAY_FLATTEN 將多個層級的陣列合併為一個陣列:

SELECT x, ARRAY_FLATTEN(x) FROM (SELECT ARRAY(1, ARRAY(2, ARRAY(3, ARRAY()))) AS x); x | array_flatten ----------------+--------------- [1,[2,[3,[]]]] | [1,2,3] (1 row)

陣列函數 ARRAY_CONCAT 和 ARRAY_FLATTEN 使用動態類型規則。如果輸入不是陣列,它們會傳回 null 而不是錯誤。GET_ARRAY_LENGTH 函數傳回給定的物件或陣列路徑的 SUPER 陣列的長度。

SELECT c_name FROM customer_orders_lineitem WHERE GET_ARRAY_LENGTH(c_orders) = ( SELECT MAX(GET_ARRAY_LENGTH(c_orders)) FROM customer_orders_lineitem );

下列範例使用 SPLIT_TO_ARRAY 將字串分割為字串陣列。該函數使用分隔符號做為選用參數。如果沒有分隔符號,則預設為逗號。

SELECT SPLIT_TO_ARRAY('12|345|6789', '|'); split_to_array --------------------- ["12","345","6789"] (1 row)

定序行為

您可以使用 SUPER 透過 CREATE TABLE 設定欄的定序、採用透過 CREATE DATABASE 設定的預設定序,以及透過 COLLATE 函式設定表達式的定序。

定序設定會套用至儲存在 SUPER 中的所有比較運算子和字串值,無論其為字串值、SUPER 陣列內的字串,還是 SUPER 物件的值。SUPER 物件的定序行為僅會套用至值,不會套用至屬性。例如,具有不區分大小寫定序 {"attribute": "a"} = {"attribute": "A"} 的值比較結果會傳回 true,而 {"attribute": "a"} = {"ATTRIBUTE": "a"} 會傳回 false。

資訊函式

SUPER 資料欄支援傳回動態類型和 SUPER 值的其他類型資訊的檢查函數。最常見的範例是 JSON_TYPEOF 純量函數,此函數會根據 SUPER 值的動態類型,傳回含有布林值、數字、字串、物件、陣列或 null 的 VARCHAR。Amazon Redshift 支援 SUPER 資料欄的下列布林函數:

如需 SUPER 類型資訊函式的詳細資訊,請參閱 SUPER 類型資訊函數

字串函數

若要在 SUPER 資料類型中使用字串常值的字串函數,您必須先將字串常值轉換為字串類型,才能套用函數。如果輸入不是字串常值,函數會傳回 null。

字串函數 現在支援最多 16,000,000 個位元組。

下列範例使用 SUBSTRING 擷取大小為 5,000,000 個位元組的字串預覽,存放在 SUPER JSON 物件中

CREATE TABLE customer_data ( customer_id INT, profile SUPER ); INSERT INTO customer_data VALUES ( 1, JSON_PARSE('{"name": "John Doe", "description": "' || REPEAT('A', 5000000) || '"}') ); SELECT customer_id, profile.name::VARCHAR AS name, SUBSTRING(profile.description::VARCHAR, 1, 50) AS description_preview FROM customer_data; customer_id | name | description_preview -------------+----------+---------------------------------------------------- 1 | John Doe | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

下列範例示範 SUPER 陣列中字串常值的 LEFT、RIGHT 和 CONCAT 函數:

CREATE TABLE documents ( doc_id INT, chapters SUPER ); INSERT INTO documents VALUES ( 1, JSON_PARSE('["' || REPEAT('hello', 400000) || '", "' || REPEAT('world', 600000) || '"]') ); SELECT doc_id, LEFT(chapters[0]::VARCHAR, 20) AS chapter1_start, RIGHT(chapters[1]::VARCHAR, 20) AS chapter2_end, LEN(CONCAT(chapters[0]::VARCHAR, chapters[1]::VARCHAR)) AS concat_size FROM documents; doc_id | chapter1_start | chapter2_end | concat_size --------+----------------------+----------------------+------------- 1 | hellohellohellohello | worldworldworldworld | 5000000

下列範例會將獨立字串存放在 SUPER 中:

CREATE TABLE text_storage ( text_id INT, content SUPER ); INSERT INTO text_storage VALUES (1, REPEAT('A', 8000000)), (2, REPEAT('B', 16000000)); SELECT text_id, LEN(content::VARCHAR) AS content_length FROM text_storage; text_id | content_length ---------+---------------- 1 | 8000000 2 | 16000000