SQL 標準では、非決定論的関数 (CASE 式 WHEN 節の NPS® random() 関数など) を使用できません。 ただし、標準仕様を拡張した NPS SQL では、このような関数を使用できます。 このタイプの式は、予期したとおりに動作しない可能性があるため、使用する際には注意が必要です。
SELECT CASE WHEN random() = .1 THEN 'A' WHEN random() = .2 THEN 'B'
ELSE 'C' END FROM tblA
このため、システムは、各 WHEN 式を評価するときに、random() 関数を別個に評価します。 これは、random() のような非決定論的関数が関係していて、実行するたびに異なる値が返される可能性がある場合に、重要です。
SELECT CASE WHEN rand = .1 THEN 'A' WHEN rand = .2 THEN 'B' ELSE 'C'
END
FROM (SELECT random() rand FROM tblA LIMIT ALL) subset
副照会は、LIMIT ALL があるために親照会へのプルアップが行われず、random() 関数は tblA の行ごとに 1 回だけ呼び出されるため、それぞれの WHEN 節では同一の random() の結果がテストされます。
前の例では、標準で検索済み CASE を呼び出す一種の CASE 式を使用しました。 ただし、SQL は別の形式の CASE 式 (単純 CASE と呼ばれる) を提供します。
SELECT CASE random() WHEN .1 THEN 'A' WHEN .2 THEN 'B' ELSE 'C' END
FROM tblA
この形式では、random() 関数が 1 回呼び出されるように見えます。 しかし標準では、単純 CASE 式は、さらに冗長な検索済み CASE の等価物とまったく同じものを意味すると定められています。 そのためシステムは、これらの例を両方とも同じ方法で処理し、同じ注意事項が適用されます。
他にも CASE には、NULLIF、NVL、NVL2、COALESCE、DECODE のようなバリアントがあります。これらは CASE 式に変換されるため、動作は同じで、同じ注意が必要となります。