2016-06-20 7 views
1

関数の中では、SELECT式の中に非常に長い列のリストがあります。select_list内の条件:一部の列のみを取ります

この関数は、フロントエンドからさまざまな時点で呼び出されます。しかし、2つのケースがあります。あるケースでは、その関数リストがSELECTリストにすべての列を持つようにしたいと思います。別のものでは私はその半分しか持ちたいと思っていない。フェッチする列は、フロントエンドに設定された関数パラメータwithAdditionalStuffによって決まります。もちろん

、両方のケースでは、列はすべての行で同じです。

  • withAdditionalStuff = falseは意味:、
  • withAdditionalStuff = trueはそれがcolumnAを返すべきである意味、すべての行に対してcolumnA、columnB、columnC ...を返しますcolumnB、columnC、columnD、columnE、columnF ...すべての行。

だから、何私が必要となることは、このようなものです:

SELECT many_columns_here ..... IF `withAdditionalStuff` = TRUE 
THEN many_many_other_columns_here... END IF; FROM.... 

しかし、それは動作しません。

しかし、CASE 'withAdditionalStuff' = TRUE THEN some_column END AS some_column内のすべての列をラップすると、もちろん列を完全に省略するのではなく、PostgreSQLは常に列some_columnを返します。したがって、関数の設定をwithAdditionalStuffにすると、空の列がたくさんあります。それに加えて、CASE WHENの中に数十の列タイトルをラップするのは非常に面倒です。

SELECTリスト内に、どの列を取得して完全に省略するかを決定する方法がありますか?

この関数は、結果をjsonbとして返します。

私はPostgreSQL 9.4.4を使用しています。

+0

達成したいことはわかりません。行ごとに異なる数の列が必要な場合は、それは不可能です。あなたの質問を編集して、そのデータに基づいてサンプルデータと予想される出力を加えてください。 (_formatted_ text please、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-質問/ 285557#285557)) –

+0

私は文言を変更しました。データの内容が関係ないため、ここではサンプルデータが大いに役立つとは思いません。 – cis

+0

なぜあなたは単に2つのビューを作成しないのですか? 1つはすべての列で、もう1つは必要な列だけです。 –

答えて

1

MS-SQLServerのような他のRDBMSとは異なり、PostgreSQLでは関数の結果を明確に定義する必要があるため、結果の列を省略することはできません。

これを回避する方法の1つは、通常のレコードセットではなくJSONオブジェクトを返すことです。このようにして、必要な特定の列を使用して動的にクエリを構築し、結果を返すことができます。

RETURN QUERY EXECUTE 
    $$ SELECT to_jsonb(x) FROM (
    SELECT $$||concat_ws(',', 
     CASE WHEN withAdditionalStuff THEN $$ AdditionalStuff $$ END, 
     CASE WHEN withExtraStuff  THEN $$ ExtraStuff $$ END, 
     ... 
    )||$$ 
    FROM ... 
    WHERE ... 
    ) x $$; 
+1

SQL Serverは、_functions_の結果が「明確に定義されている」ことを要求しています。あなたはおそらくストアド_procedures_を参照しています.SQLサーバで任意の結果を返すことができます(refcursorsを使ってPostgresで行うこともできます) –

+0

ありがとうございます。とにかく関数はjsonbを返すので、問題はありません。しかしSELECTの内側はどこに置くのですか? – cis

+0

@cisレスポンスを更新しました。 'concat_ws'はNULLパラメータを無視するので、この種のものには完璧です。 –

関連する問題