順序の関数
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}