ホームページ >データベース >mysql チュートリアル >SQL Server の JOIN 条件で CASE ステートメントを直接使用できますか?
SQL Server の JOIN 条件と CASE ステートメント: 詳細
sys.partitions
や sys.allocation_units
などの Microsoft SQL Server 2008 R2 のシステム ビューを操作する場合、多くの場合、それらの間の関係は sys.allocation_units.type
の値に依存します。 これらのテーブルを結合する一般的なアプローチには、CASE
条件内の JOIN
ステートメントが含まれる場合があります。
次のシナリオを調べてみましょう: sys.indexes
、sys.partitions
、sys.allocation_units
を接続するには、allocation_units.type
に基づく条件付き結合が必要です。最初の試行は次のようになります:
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) THEN a.container_id = p.hobt_id WHEN a.type IN (2) THEN a.container_id = p.partition_id END</code>
ただし、これでは構文エラーが発生します。 この問題は、SQL Server の CASE
ステートメントが実行可能ステートメントではなくスカラー値を生成するという事実に起因します。 JOIN
句内の等価比較を直接制御することはできません。
解決策: CASE を使用したブール評価
これを解決するには、CASE
ステートメントを再構築して、比較できるブール値 (true の場合は 1、false の場合は 0) を返すようにする必要があります。
<code class="language-sql">SELECT * FROM sys.indexes i JOIN sys.partitions p ON i.index_id = p.index_id JOIN sys.allocation_units a ON CASE WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1 WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1 ELSE 0 END = 1</code>
AND
句内で WHEN
を使用し、結果の CASE
式を 1 と比較することで、条件付き結合を効率的に作成できます。 これは、CASE
ステートメントは強力ですが、JOIN
条件内で使用するには、戻り値の型と明示的なブール評価の必要性を慎重に考慮する必要があることを示しています。 CASE
内の JOIN
ステートメント自体内での直接代入または等価性テストはサポートされていません。
以上がSQL Server の JOIN 条件で CASE ステートメントを直接使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。