順序変換式

構文

transform_expression ::= SEQ_TRANSFORM "(" expression "," expression ")"

セマンティクス

順序変換式は、順序を別の順序に変換します。構文的には、seq_transformという名前の関数のように見えます。最初の引数は、変換する順序(入力順序)を生成する式であり、2番目の引数は入力順序の各項目に対して計算されるマッパー式です。seq_transform式の結果は、マッパー式の各評価によって生成される順序の連結となります。マッパー式は、$変数を介して現在の入力項目にアクセスできます。

例6-49 順序変換式

たとえば、次のデータを持つsales表があるとします。

CREATE TABLE sales (
    id INTEGER,
    sale RECORD (
        acctno INTEGER,
        year INTEGER,
        month INTEGER,
        day INTEGER,
        state STRING,
        city STRING,
        storeid INTEGER,
        prodcat STRING,
        items ARRAY(
            RECORD (
                prod STRING,
                qty INTEGER,
                price INTEGER
            )
        )
    ),
    PRIMARY KEY (id)
);
INSERT INTO sales VALUES (
    1,
    {
        "acctno" : 349,
        "year" : 2000, 
        "month" : 10, 
        "day" : 23,
        "state" : "CA", 
        "city" : "San Jose", 
        "storeid" : 76,
        "prodcat" : "vegies",
        "items" :[ 
            { "prod" : "tomatoes", "qty" : 3, "price" : 10.0 },
            { "prod" : "carrots", "qty" : 1, "price" : 5.0 },
            { "prod" : "pepers", "qty" : 1, "price" : 15.0 }
        ]
    }
);

salesに次の索引があるとします。

CREATE INDEX idv1 ON sales (
    sale.acctno, sale.year, sale.prodcat);

次に、アカウント番号と年度ごとの総売上を返す次の問合せを記述できます。

SELECT t.sale.acctno,
t.sale.year,
SUM(seq_transform(t.sale.items[], $price * $qty)) AS sales
FROM sales t
GROUP BY t.sale.acctno, t.sale.year;