2

SQLでのSearched CASE WHENステートメントの処理順序に関する情報が必要です。

例えば:

(CASE
     WHEN Cells.Type <> 'UOM' THEN 0
     WHEN Template_Colors.Uom_Case = 'ONE' THEN 1
     WHEN Template_Colors.Uom_Case = 'MUL' THEN 2
 END) AS CELL_WHAT_UOM

0がない限り、結果は常にである必要がありますCells.Type <> 'UOM'

SQLパーサーは通常、下から上に進むことは知っていますが、Oracleではクエリが正しく機能しているように見えるため、WHEN句はそのままの順序で処理されると思います。

ケースが他のケースよりも先に処理されることが100%保証されていますか?0

または私は強制的に書く必要があります:

(CASE
     WHEN Cells.Type <> 'UOM' THEN 0
     WHEN Cells.Type = 'UOM' AND Template_Colors.Uom_Case = 'ONE' THEN 1
     WHEN Cells.Type = 'UOM' AND Template_Colors.Uom_Case = 'MUL' THEN 2
 END) AS CELL_WHAT_UOM

...?

Oracle 10g + SQL Server 2008 r2+Postgreに関するこの情報が必要です。

4

1 に答える 1

5

Cells.Typeがに等しくない場合UOM、結果は0になることが保証されます。

(確かにSQL Serverでは)保証されていないのは、他のブランチのが計算されないことです。

したがって、次のことを行った場合:

CASE WHEN a = 0 THEN 0 ELSE 10/a END

ゼロ除算エラーが発生する可能性があります。


そして、あなたの例でも:

WHEN Cells.Type = 'UOM' AND Template_Colors.Uom_Case = 'ONE' THEN ...

述部が評価される順序は保証されていないためTemplate_Colors.Uom_Case、引き続きアクセスできます。このコラムにアクセスできるかどうかについて懸念があるかどうかわからないため、現時点でこれ以上のアドバイスはありません。


SQL Serverのドキュメント

  • 指定された順序で、各句のBoolean_expressionを評価します。WHEN

  • に評価される最初のBoolean_expressionのresult_expressionを返します。TRUE

  • ブール式が評価されない場合、データベースエンジンは、句が指定されている場合はelse_result_expressionを返し、句が指定されない場合は値を返します。TRUEELSENULLELSE

オラクル

検索された式では、Oracleは、trueの条件CASEの発生が見つかるまで左から右に検索し、return_exprを返します。真の条件が見つからず、句が存在する場合、Oracleはelse_exprを返します。それ以外の場合、Oracleはを返します。ELSEnull

PostGre

結果がtrueの場合、CASE式の値は条件に従う結果になります。結果がfalseの場合、後続のWHEN句は同じ方法で検索されます。

Ansi 92(ドラフト)

a<search condition>の一部<searched when clause>のof<case specification>がtrueの場合、theの値は、trueの最初の(左端)のの<case specification>値であり、のデータ型としてキャストされます。<result><searched when clause><search condition><case specification>

于 2013-01-31T09:11:06.950 に答える