カテゴリ:

半構造化データ関数と構造化データ関数 (配列/オブジェクト)

ARRAY_SLICE

入力配列の要素の指定されたサブセットから構築された配列を返します。

構文

ARRAY_SLICE( <array> , <from> , <to> )
Copy

引数

array

結果の配列を構築するために要素のサブセットが使用されるソース配列です。

from

ソース配列内の位置です。最初の要素の位置は 0 です。 from 未満の位置の要素は、結果の配列に含まれません。

to

ソース配列内の位置です。 to 以上の位置の要素は、結果の配列に含まれません。

戻り値

戻り値のデータ型は ARRAY です。

使用上の注意

  • 出力には、パラメーター to で指定された要素までが含まれますが その要素は含みません

  • 配列が NULLの場合、結果は NULLです。

  • from または to のいずれかが NULLの場合、結果は NULLです。

  • from または to のいずれかが負の場合は、配列の先頭ではなく、配列の末尾を基準にします。例:「-2」は配列内の最後から2番目の位置を指します。

  • fromto の両方が配列の上限を超えているか、両方が配列の下限を超えている場合、結果は空のセットになります。

  • 関数に 構造化 ARRAY を渡すと、関数は同じ型の構造化 ARRAY を返します。

これらの規則の多く(例:配列の最後からのインデックスとしての負の数の解釈、およびスライスが to インデックスまでであるがそれを含まないというルール)は、Pythonなどのプログラミング言語での配列スライスのルールに似ています。

これらの各ルールは、以下の少なくとも1つの例に示されています。

これは、配列をスライスする簡単な例を示しています。

select array_slice(array_construct(0,1,2,3,4,5,6), 0, 2);
Copy

出力:

+---------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), 0, 2) |
|---------------------------------------------------|
| [                                                 |
|   0,                                              |
|   1                                               |
| ]                                                 |
+---------------------------------------------------+
Copy

これは、入力配列として NULL を使用した効果を示しています。

select array_slice(NULL, 2, 3);
Copy

出力:

+-------------------------+
| ARRAY_SLICE(NULL, 2, 3) |
|-------------------------|
| NULL                    |
+-------------------------+
Copy

これは、スライスインデックスの1つとして NULL を使用した効果を示しています。

select array_slice(array_construct(0,1,2,3,4,5,6), NULL, 2);
Copy

出力:

+------------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), NULL, 2) |
|------------------------------------------------------|
| NULL                                                 |
+------------------------------------------------------+
Copy

これは、インデックスとして負の数を使用する効果を示しています。数値は、配列の末尾からのオフセットとして解釈されます。

select array_slice(array_construct(0,1,2,3,4,5,6), 0, -2);
Copy

出力:

+----------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), 0, -2) |
|----------------------------------------------------|
| [                                                  |
|   0,                                               |
|   1,                                               |
|   2,                                               |
|   3,                                               |
|   4                                                |
| ]                                                  |
+----------------------------------------------------+
Copy

両方のインデックスが負になる可能性があります。つまり、両方が配列の末尾に関連する場合があります。

select array_slice(array_construct(0,1,2,3,4,5,6), -5, -3);
Copy

出力:

+-----------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), -5, -3) |
|-----------------------------------------------------|
| [                                                   |
|   2,                                                |
|   3                                                 |
| ]                                                   |
+-----------------------------------------------------+
Copy

この例では、両方のインデックスが配列の末尾を超えています。

select array_slice(array_construct(0,1,2,3,4,5,6), 10, 12);
Copy

出力:

+-----------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), 10, 12) |
|-----------------------------------------------------|
| []                                                  |
+-----------------------------------------------------+
Copy

この例では、両方のインデックスが配列の開始前です。

select array_slice(array_construct(0,1,2,3,4,5,6), -10, -12);
Copy

出力:

+-------------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT(0,1,2,3,4,5,6), -10, -12) |
|-------------------------------------------------------|
| []                                                    |
+-------------------------------------------------------+
Copy

インデックスは数値でなければなりませんが、配列の要素は数値である必要はありません。

SELECT ARRAY_SLICE(ARRAY_CONSTRUCT('foo','snow','flake','bar'), 1, 3);
Copy

出力:

+----------------------------------------------------------------+
| ARRAY_SLICE(ARRAY_CONSTRUCT('FOO','SNOW','FLAKE','BAR'), 1, 3) |
|----------------------------------------------------------------|
| [                                                              |
|   "snow",                                                      |
|   "flake"                                                      |
| ]                                                              |
+----------------------------------------------------------------+
Copy