ホームページ >データベース >mysql チュートリアル >SQL Server の JOIN 条件で CASE ステートメントを直接使用できますか?

SQL Server の JOIN 条件で CASE ステートメントを直接使用できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-20 07:36:08800ブラウズ

Can CASE Statements Be Used Directly in JOIN Conditions in SQL Server?

SQL Server の JOIN 条件と CASE ステートメント: 詳細

sys.partitionssys.allocation_units などの Microsoft SQL Server 2008 R2 のシステム ビューを操作する場合、多くの場合、それらの間の関係は sys.allocation_units.type の値に依存します。 これらのテーブルを結合する一般的なアプローチには、CASE 条件内の JOIN ステートメントが含まれる場合があります。

次のシナリオを調べてみましょう: sys.indexessys.partitionssys.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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。