読者です 読者をやめる 読者になる 読者になる

T-SQL 非決定的関数やサブクエリを case / choose / coalesce の条件部で使うときは注意が必要!

SQL Server

T-SQL でズンドコキヨシを書こうとして気付いたのですが、

select case cast(RAND() * 100 as int) % 2 + 1 
  when 1 then N'ズン' 
  when 2 then N'ドコ' 
  else '意図していない!' end

これが '意図していない!' を返す時があったり、

select choose(cast(RAND() * 100 as int) % 2 + 1, N'ズン', N'ドコ')

これが null を返す時があります。

バグってるのかと思って調べてみると以下のサイトが見つかりました。
SQL Server CASE Law
COALESCE((subquery), 1) may return NULL | Microsoft Connect

ここでは coalesce ですが、case / choose も同じようです。

非決定的な関数の場合、条件判定の際に、複数回実行するそうです。

case の例だと、1つ目の条件(when 1)の時の実行結果が 2 で、2つ目の条件(when 2)の時の実行結果が 1 になると、else の '意図していない!' になってしまうという。
choose も中で同じような事やってるんですかねー。

上の記事でも書いてる通り、条件決める値は1回だけの実行が直感的で良いと思うけど。。

これ調べててズンドコキヨシ書けてない。。