順序の関数
seq_concat関数
seq_concat
は可変個引数関数であり、任意の数の引数を指定できます。引数リストに指定されている順序で引数(ある場合)を評価し、これらの引数によって返される順序を連結します。この関数は、入力引数として任意のデータ型を受け入れます。入力がスカラーの場合、入力項目はサイズ1の順序として処理されます。
any* seq_concat(any*, ...)
セマンティクス:
- any: 前述の構文のany?要素は、任意のデータ型にできます。
seq_concat
関数は、任意の数の入力引数を受け入れます。引数はカンマ区切り形式である必要があります。 - 戻り型: 任意の型
例1:
SELECT acct_id,
concat(stream_acct.acct_data[].firstName, ' ',stream_acct.acct_data[].lastName) AS Fullname,
seq_concat(stream_acct.acct_data[].contentStreamed[].showName) AS Uwatched,
seq_concat(stream_acct.acct_data[].contentStreamed[].genres) AS Uprefer
FROM stream_acct
ORDER BY acct_id;
説明:
この例では、seq_concat
関数は、すべての視聴済番組とそのジャンルをカンマ区切りリストとしてリストします。
{"acct_id":1,"Fullname":"Adam Phillips","Uwatched":["At the Ranch","Bienvenu"],"Uprefer":[["action","crime","spanish"],["comedy","french"]]}
{"acct_id":2,"Fullname":"Adelaide Willard","Uwatched":"Bienvenu","Uprefer":["comedy","french"]}
concat
関数も、firstName
およびlastName
という2つの文字列を連結し、出力に単一のオブジェクトFullname
として表示するために問合せで使用されています。詳細は、「concat関数」を参照してください。
例2:
SELECT
concat(stream_acct.acct_data[].firstName, ' ',stream_acct.acct_data[].lastName) AS Fullname,
CASE
WHEN exists stream_acct.acct_data[].contentStreamed[].showId
THEN seq_concat(stream_acct.acct_data[].contentStreamed[0].showName, stream_acct.acct_data[0].contentStreamed[0].seriesInfo[0].episodes[0], stream_acct.acct_data[0].contentStreamed[0].seriesInfo[0].episodes[1],stream_acct.acct_data[].contentStreamed[1].showName, stream_acct.acct_data[0].contentStreamed[0].seriesInfo[1].episodes[0], stream_acct.acct_data[0].contentStreamed[0].seriesInfo[1].episodes[1])
ELSE "Start streaming your favorite shows here"
END AS Showdetails
FROM stream_acct WHERE acct_id=1;
説明:
ユーザーが何かの番組を視聴した場合、詳細がcontentSreamed
JSONフィールドに格納されます。前述の問合せでは、ストリーミングの日付、エピソードの詳細、期間および各番組の経過時間を取得します。seq_concat
関数は、すべての詳細を連結して出力に表示するために使用されます。
{"Fullname":"Adam Phillips","Showdetails":["At the Ranch",{"date":"2022-04-18","episodeID":20,"lengthMin":85,"minWatched":85},{"date":"2022-04-18","episodeID":30,"lengthMin":60,"minWatched":60},"Bienvenu",{"date":"2022-04-25","episodeID":40,"lengthMin":50,"minWatched":50},{"date":"2022-04-27","episodeID":50,"lengthMin":45,"minWatched":30}]}
concat
関数も、firstName
およびlastName
という2つの文字列を連結し、出力に単一のオブジェクトFullname
として表示するために問合せで使用されています。詳細は、「concat関数」を参照してください。
上記に加え、順序に対する次の集計関数もあります。これらの関数については、順序集計関数の項で説明します。
- long seq_count(any*)
- number seq_sum(any*)
- number seq_avg(any*)
- any_atomic seq_min(any*)
- any_atomic seq_max(any*)
seq_distinct関数
入力順序の個別の値を返します。
any* seq_distinct(any*)
セマンティクス:
- any:
seq_distinct
関数は、入力引数として任意のパラメータ・タイプを受け入れます。 - 戻り型: 任意の型
例:
users
表のスキーマを次のように作成します:CREATE TABLE users ( id INTEGER,
firstName STRING,
lastName STRING,
otherNames ARRAY(RECORD(first STRING, last STRING)),
age INTEGER,
income INTEGER,
address JSON,
connections ARRAY(INTEGER),
expenses MAP(INTEGER),
PRIMARY KEY (id) );
INSERT INTO users VALUES (
10,
"John",
"Smith",
[ {"first" : "Johny", "last" : "BeGood"} ],
22,
45000,
{
"street" : "Pacific Ave",
"number" : 101,
"city" : "Santa Cruz",
"state" : "CA",
"zip" : 95008,
"phones" : [
{ "area" : 408, "number" : 4538955, "kind" : "work" },
{ "area" : 831, "number" : 7533341, "kind" : "home" },
{ "area" : 831, "number" : 7533382, "kind" : "mobile" }
]
},
[ 30, 55, 43 ],
DEFAULT
);
説明:
ユーザーは同じ市外局番に複数の電話番号を設定できます。市外局番が異なる電話番号を持っているユーザーの数を決定するには、(同じ市外局番の電話番号が複数ある場合でも) 1度だけ特定のユーザーをカウントする必要があります。
seq_distinct
関数を使用して実行できます。 SELECT $area, count(*) AS cnt
FROM Users u, seq_distinct(u.address.phones.area) AS $area
GROUP BY $area
{"area":408,"cnt":1}
{"area":831,"cnt":1}
ユーザーJohn Smithには3つの電話番号があり、そのうちの2つは市外局番が同じです。ただし、問合せでは、個別の領域コードのみがフェッチされます。