Microsoft SQL Server
クロス適用
サーチ…
セルから動的に生成された行で表の行を結合する
CROSS APPLYを使用すると、テーブルから行を「結合」することができます。
製品の配列(ProductList列)を含む列を持つCompanyテーブルと、これらの値を解析して一連の製品を返す関数があるとします。 Companyテーブルからすべての行を選択し、この関数をProductList列に適用し、親Company行との結果を「結合」することができます。
SELECT *
FROM Companies c
CROSS APPLY dbo.GetProductList( c.ProductList ) p
各行について、 ProductListセルの値が関数に提供され、関数はそれらの製品を親行と結合できる行の集合として返します。
JSON配列をセルに格納してテーブル行を結合する
CROSS APPLYを使用すると、テーブルの行を列に格納されたJSONオブジェクトのコレクションに「結合」できます。
JSON配列としてフォーマットされた一連の製品(ProductList列)を含む列を持つCompanyテーブルがあるとします。 OPENJSONテーブル値関数は、これらの値を解析して一連の製品を返すことができます。 Companyテーブルからすべての行を選択し、OPENJSONを使用してJSON製品を解析し、親会社の行を使用して結果を「結合」することができます。
SELECT *
FROM Companies c
CROSS APPLY OPENJSON( c.ProductList )
WITH ( Id int, Title nvarchar(30), Price money)
各行について、 ProductListセルの値は、JSONオブジェクトをWITH句に定義されたスキーマを持つ行に変換するOPENJSON関数に提供されます。
行を配列値でフィルタリングする
タグのリストをコマンドで区切った値として行に格納すると、 STRING_SPLIT関数を使用してタグのリストを値の表に変換できます。 CROSS APPLYを使用すると、 STRING_SPLIT関数で解析された値を親行と結合することができます。
カンマで区切ったタグの配列(例:promo、sales、new)を含む列を持つProductテーブルがあるとします。 STRING_SPLITとCROSS APPLYを使用すると、製品の行をタグに結びつけることができるため、商品をタグでフィルタリングできます。
SELECT *
FROM Products p
CROSS APPLY STRING_SPLIT( p.Tags, ',' ) tags
WHERE tags.value = 'promo'
行ごとに、 タグセルの値は、タグ値を返す関数をSTRING_SPLITに提供されます。次に、これらの値で行をフィルタリングできます。
注: STRING_SPLIT関数はSQL Server 2016より前には使用できません