GENERATE_SERIES(SQL Server 2022)

ITコーディネータのシュウです。

IMG_6862

上の写真は、ゴールデンウィークに、家族で埼玉県滑川町にある、国営武蔵丘陵森林公園に行ったときに撮った写真です。結構敷地が広くて、東京ドームの約65倍の広さがあるそうで、一回りするだけでもかなりの時間を要します。中央口、西口、北口、南口のエリアがあり、それぞれに楽しめるような場所が用意されていて、家族でゆっくりと自然に触れるのにはとてもよいところだと思います。今回は、西口広場に、約10万本のネモフィラという北アメリカ原産の植物で、きれいな青色に染まる花畑があるということで写真を撮ってきました。ただ、少し時期が遅かったので、だいぶ色は薄くなってしまったようです。ネモフィラは、茨城県のひたち海浜公園のネモフィラもとても有名ですね。

<本日の題材>
GENERATE_SERIES(SQL Server 2022

今回は、SQL Server2022で新しく機能として追加された関数で、GENERATE_SERIESという関数について取り上げてみたいと思います。この関数は、引数で指定した範囲に指定した間隔で数値を生成する関数になります。

例)
以前、WITH句を使って、1から20までの連続した整数を出力するSQLを取り上げたことがありましたが、それを、今回のGENERATE_SERIES関数で簡単に作成できることを確認したいと思います。

まず、前回行った WITH句を使ったやり方は、下記のようなものでした。

WITH RECUR_SEISU(val) AS (
SELECT 1
UNION ALL
SELECT val+1
FROM RECUR_SEISU
WHERE val+1 <= 20)
SELECT val FROM RECUR_SEISU;

blog111_1

再帰WITH句で、最初にSELECT 1として最初の値を取得し、その結果を使用してUNION ALLの下のSELECT文で、条件を満たすあいだそれを繰り返して処理をしているかたちですが、慣れないと少々わかりにくい方法です。

これに対して、GENERATE_SERIES関数は、構文が
GENERATE_SERIES ( start, stop [, step ] )
ということで、start(開始の値)、stop(終了の値)、step(間隔の値)を入れるだけで、同様のことができます。stepは、マイナス値や小数点なども設定することができ、省略すると既定値の1と判断されます。
下記のように設定できます。

SELECT value
FROM GENERATE_SERIES(1, 20);

blog111_2

WITH句で行ったときと同様の結果が出力されました。

同じようにして、1 から 0 まで -0.1 ずつ減らしていくかたちにしてやってみます。

SELECT value
FROM GENERATE_SERIES(1, 0, -0.1);

blog111_3

エラーが起きてしまいました。
エラーメッセージを見ると、引数はすべて同じ型でないといけないと言っています。
start と stop の値が 1、0 で int に対して、step の値が -0.1 で decimalの値になっているのが問題のようです。
なので、すべて decimal のかたちにしてみます。

SELECT value
FROM GENERATE_SERIES(1.0, 0.0, -0.1);

blog111_4

今度はエラーなく実行できたことが確認できました。

今日は以上まで。

にほんブログ村 IT技術ブログへ
にほんブログ村