ホームページ > データベース > mysql チュートリアル > さまざまな列名と型を持つ PostgreSQL で動的 SQL 戻り値の型を処理するにはどうすればよいですか?

さまざまな列名と型を持つ PostgreSQL で動的 SQL 戻り値の型を処理するにはどうすればよいですか?

DDD
リリース: 2025-01-22 23:46:11
オリジナル
103 人が閲覧しました

How Can I Handle Dynamic SQL Return Types in PostgreSQL with Varying Column Names and Types?

PostgreSQL 動的 SQL と戻り値の型

異なる列名と型を持つカスタム戻り値の型を処理する

あなたのシナリオでは、列名と型が異なるため、戻り値の型が変わります。これに対処するには、匿名レコード タイプを返す PostgreSQL の機能を利用できます:

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS SETOF record AS
...</code>
ログイン後にコピー

ただし、このアプローチでは、各関数呼び出しで列定義を手動で指定する必要があります。

<code class="language-sql">SELECT * FROM data_of(17)
AS foo (colum_name1 integer
      , colum_name2 text
      , colum_name3 real);</code>
ログイン後にコピー

この面倒なアプローチを回避するには、JSON や XML などのドキュメント データ型を使用して非構造化データを保存できます。

<code class="language-sql">CREATE FUNCTION data_of(integer)
RETURNS JSONB AS
...</code>
ログイン後にコピー

ただし、このアプローチでは、PostgreSQL の構造化データ型の利点が犠牲になります。

列変換を使用した戻り値の型を修正しました

データ構造に一貫性がある場合 (列名を除く)、正しく名前と型が指定された固定数の列を返すことができます。

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, col2 text, col3 text) AS
$func$
...</code>
ログイン後にコピー

わかりやすくするために、各列は明示的に TEXT 型に変換されます。

同じ型の可変数の列

同じ型の可変数の列がある場合は、配列を使用して値を保存できます。

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
ログイン後にコピー
ログイン後にコピー

また、列名を配列として返すこともできます:

<code class="language-sql">CREATE FUNCTION data_of(_id integer)
RETURNS TABLE (datahora timestamp, names text[], values float8[]) AS
$func$
...</code>
ログイン後にコピー
ログイン後にコピー

テーブルのすべての列を多態的に返します

構造に関係なく、テーブルのすべての列を返すには、anyelement 疑似データ型を使用できます。

<code class="language-sql">CREATE FUNCTION data_of(_tbl_type anyelement, _id int)
RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format('
      SELECT *
      FROM   %s  -- pg_typeof returns regtype, quoted automatically
      WHERE  id = 
      ORDER  BY datahora'
    , pg_typeof(_tbl_type))
   USING  _id;
END
$func$;</code>
ログイン後にコピー

目的のテーブル型の NULL を指定してこの関数を呼び出し、戻り値の型を動的に決定します。

<code class="language-sql">SELECT * FROM data_of(NULL::pcdmet, 17);</code>
ログイン後にコピー

以上がさまざまな列名と型を持つ PostgreSQL で動的 SQL 戻り値の型を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート