IBM PureData System for Analytics, バージョン 7.1

CASE

SQL 標準では、非決定論的関数 (CASE 式 WHEN 節の NPS® random() 関数など) を使用できません。 ただし、標準仕様を拡張した NPS SQL では、このような関数を使用できます。 このタイプの式は、予期したとおりに動作しない可能性があるため、使用する際には注意が必要です。

例:
SELECT CASE WHEN random() = .1 THEN 'A' WHEN random() = .2 THEN 'B'
ELSE 'C' END FROM tblA
式は、以下の方法で評価されます。
  • 乱数を生成する
  • 生成された数値が .1 である場合は、'A' を返す
  • 2 番目の乱数を生成する
  • 新たに生成された数値が .2 である場合は、'B' を返す
  • それ以外の場合は、'C' を返す

このため、システムは、各 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 と呼ばれる) を提供します。

単純 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 式に変換されるため、動作は同じで、同じ注意が必要となります。



フィードバック | Copyright IBM Corporation 2014 | 最終更新日: 2014-02-28