順序の関数

any* seq_concat(any*, ...)

seq_concatは可変個引数関数であり、任意の数の引数を指定できます。引数リストに指定されている順序で引数(ある場合)を評価し、これらの引数によって返される順序を連結します。

上記に加え、順序に対する次の集計関数もあります。これらの関数については、順序集計関数の項で説明します。

  • long seq_count(any*)
  • number seq_sum(any*)
  • number seq_avg(any*)
  • any_atomic seq_min(any*)
  • any_atomic seq_max(any*)

any* seq_distinct(any*)

入力順序の個別の値を返します。

例:

ユーザーに関する情報を提供するユーザー表を考えてみます。
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()関数を使用して実行できます。ユーザーJohn Smithには3つの電話番号があり、そのうちの2つは市外局番が同じです。ただし、次の問合せでは、個別の領域コードのみがフェッチされます。
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}