順序の関数

seq_concat関数

seq_concatは可変個引数関数であり、任意の数の引数を指定できます。引数リストに指定されている順序で引数(ある場合)を評価し、これらの引数によって返される順序を連結します。この関数は、入力引数として任意のデータ型を受け入れます。入力がスカラーの場合、入力項目はサイズ1の順序として処理されます。

構文:
any* seq_concat(any*, ...)

セマンティクス:

  • any: 前述の構文のany?要素は、任意のデータ型にできます。seq_concat関数は、任意の数の入力引数を受け入れます。引数はカンマ区切り形式である必要があります。
  • 戻り型: 任意の型

例1:

TVストリーミング・アプリケーションでは、今後の番組に関する提案をユーザーに提供できます。これは通常、ユーザーがすでに視聴している番組またはユーザーが好むジャンルに基づいています。
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:

このTVストリーミング・アプリケーションの例では、ユーザーが視聴している番組の詳細を取得できます。
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つは市外局番が同じです。ただし、問合せでは、個別の領域コードのみがフェッチされます。