SQLServerでランダム結果取得で
NEWID()を使用する方法はよくあると思います。
ただ、NEWIDの戻り値は
uniqueidentifier型の列なので
「0~100」の範囲でランダムな値を取得したいなどといった用途にはちょっと使いにくいかと思います。
そこで、NEWID()と以前の記事で書いた
generate_seriesを組み合わせて、
「0~100」の範囲でランダムな値を1つ取得するSQLを書きたいと思います。
select top 1 NEWID() as nid , num from generate_series(1,100,1) order by nid
結果は以下のようになります。
ただしランダム故にいつもこの結果とは限りませんが(^^)
nid |
num |
13D5E354-7230-4257-9994-069DE1A87664 |
32 |
このままではnidが邪魔なので、numだけを取得するように書き加えます。
- その1(WITH句使用版)
with rndquery as
( select top 1 NEWID() as nid , num from generate_series(1,100,1) order by nid )
select num from rndquery
- その2(FROM句での指定版)
select num from ( select top 1 NEWID() as nid , num from generate_series(1,100,1) order by nid ) t
- その3(FROM句でのテーブル直積版)
select top 1 num from generate_series(1,100,1), ( select NEWID() as nid) t order by nid
どのクエリが良いか気になったので実行プランをとって見たところ
この場合、どのクエリも同じコストでした。(^^)
久々の技術関連はまずこの程度の文章でおゆるし下さいm(__)m
実はこれが次の奴にちょっと出てくるのは内緒