演算子と関数 - Amazon Redshift

Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、ブログ記事を参照してください。

演算子と関数

Amazon Redshift では、SUPER データを使用して、演算子と関数を駆使して大規模なデータセットに対して高度な分析を実行できます。SUPER データの演算子と関数は、Amazon Redshift テーブルに保存されている半構造化データの複雑な分析と操作を可能にする SQL コンストラクトです。

以下のセクションでは、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 では、10 進数値が異なる静的型であるかのように扱われ、すべての数学演算が許可されます。Amazon Redshift は、オペランドのスケールに基づいて、結果のスケールを動的に計算します。オペランドの 1 つが浮動小数点数の場合、Amazon Redshift はもう 1 つのオペランドを浮動小数点数に昇格し、結果を浮動小数点数として生成します。

算術関数

Amazon Redshift は、SUPER 列に対して次の算術関数をサポートしています。入力が数値でない場合、null を返します。

  • FLOOR。詳細については、「FLOOR 関数」を参照してください。

  • CEIL および CEILING。詳細については、「CEILING (または CEIL)関数」を参照してください。

  • ROUND。詳細については、「ROUND 関数」を参照してください。

  • TRUNC。詳細については、「TRUNC 関数」を参照してください。

  • ABS。詳細については、「ABS 関数」を参照してください。

次の例では、算術関数を使用してデータをクエリします。

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。詳細については、「array 関数」を参照してください。

  • ARRAY_CONCAT。詳細については、「array_concat 関数」を参照してください。

  • ARRAY_FLATTEN。詳細については、「array_flatten 関数」を参照してください。

  • GET_ARRAY_LENGTH。詳細については、「get_array_length 関数」を参照してください。

  • SPLIT_TO_ARRAY。詳細については、「split_to_array 関数」を参照してください。

  • SUBARRAY。詳細については、「subarray 関数」を参照してください。

他の SUPER 値を含む ARRAY 関数を使用して、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 値に関する動的型およびその他の型情報を返す検査関数をサポートします。最も一般的な例は、SUPER 値の動的型に応じて、ブール値、数値、文字列、オブジェクト、配列、または null の値を持つ VARCHAR を返す JSON_TYPEOF スカラー関数です。Amazon Redshift は、SUPER データ列に対して次のブール関数をサポートしています。

SUPER タイプ情報関数の詳細については、「SUPER 型の情報関数」を参照してください。

文字列関数

SUPER データ型で文字列リテラルを持つ文字列関数を使用するには、関数を適用する前に文字列リテラルを文字列型に変換する必要があります。入力が文字列リテラルでない場合、関数は null を返します。

文字列関数 は最大 16,000,000 バイトをサポートするようになりました。

次の例では、SUBSTRING を使用して、SUPER JSON オブジェクトに保存されているサイズ 5,000,000 バイトの文字列のプレビューを抽出します。

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