複数の地理情報関数をネストさせると、内側にネストされた関数が戻す図形タイプが外側の呼び出し関数に受け入れられない場合に、問題が生じます。内側にネストされた関数の図形タイプを外側の呼び出し関数に受け入れられるタイプに変換できれば、この問題は解決されます。
スーパータイプ ST_Geometry を戻す関数の図形タイプは、 Treat 関数を使用してサブタイプに変換することができます。たとえば、ST_Union 関数は ST_Geometry の値を戻します。 ST_Union が ST_PointOnSurface 関数の内側にネストされているとき、 ST_PointOnSurface は以下のエラーを戻します。
SQL00440N No function by the name "ST_POINTONSURFACE" having compatible arguments was found in the function path. SQLSTATE=42884
ST_PointOnSurface 関数は ST_Polygon 図形タイプまたは ST_MultiPolygon 図形タイプのいずれかになりますが、たとえ ST_Union 関数から戻される値が ST_MultiPolygon 図形タイプであっても、 ST_Union から戻される ST_Geometry とはなりません。そのため、この場合には、ST_Union 関数の図形タイプを ST_MultiPolygon に変換する必要があります。
たとえば、COUNTIES 表が COUNTY ポリゴン列を結合することにより自己接続している場合、 Treat 関数を ST_Union 関数の結果に適用して ST_Geometry タイプを ST_MultiPolygon タイプに変換してからでなければ、 ST_PointOnSurface 関数を適用することはできません。
SELECT ST_Astext(ST_PointOnSurface( TREAT ( ST_Union(c1.county, c2.county) AS ST_MultiPolygon))) FROM counties AS c1, counties AS c2;
ST_Union 関数が ST_MultiPolygon の値を戻す場合、 Treat 関数がそれを ST_MultiPolygon データ・タイプに変換します。 ST_Union 関数が ST_MultiPolygon 値を戻さない場合、Treat 関数はランタイム・エラーを戻します。
サブタイプの処理についての詳細は、SQL 解説書 を参照してください。
ST_GeometryN 関数を使用して、図形集合の要素を外側の呼び出し関数に必要な基本図形に変換します。
たとえば、ST_Union 関数によって戻される値は、常に ST_Geometry として戻される図形集合です。 Treat 関数を使用して、ST_Geometry タイプを ST_MultiPoint、 ST_MultiLineString、 ST_MultiPolygon、 ST_GeomCollection、 ST_MultiCurve、または ST_MultiSurface のいずれかのタイプのサブタイプに変換します。 ST_GeometryN 関数を、図形集合を基本図形に変換している Treat 関数の出力に適用します。
たとえば、ST_ExteriorRing 関数を前のセクションで示した例にある ST_Union 関数の結果に対して使用するには、まず ST_GeometryN 関数を使用してポリゴン要素を抽出します。
SELECT ST_AsText(ST_ExteriorRing(ST_GeometryN( TREAT ( ST_Union(c1.county, c2.county) AS ST_MultiPolygon ), 1))) FROM counties AS c1, counties AS c2;
これが必要になるのは、階層内のスーパータイプからサブタイプに移動する場合だけです。サブタイプの処理についての詳細は、SQL 解説書 を参照してください。