変数のテキストに基づいて特定の列をフェッチする方法はありますか?文字列変数を含む列を取得する
は、たとえば、あなたがeまたはfの
列Cに格納フィールド名fは、あなたがテーブルD、Eを照会する
Cとテーブル、Bを、持っている
SELECT a, b, CAST(c as ?) AS e_or_f FROM table1 JOIN table2
-
明らかに、if/elseまたはcase演算子を使用できますが、それを書く必要はありません。
おかげでこの場合
変数のテキストに基づいて特定の列をフェッチする方法はありますか?文字列変数を含む列を取得する
は、たとえば、あなたがeまたはfの
列Cに格納フィールド名fは、あなたがテーブルD、Eを照会する
Cとテーブル、Bを、持っている
SELECT a, b, CAST(c as ?) AS e_or_f FROM table1 JOIN table2
-
明らかに、if/elseまたはcase演算子を使用できますが、それを書く必要はありません。
おかげでこの場合
は、あなたが本当にしたいことは、CASEを使用するCTEまたはインライン・ビューを持つ可能性が混合されます。たとえば:
SELECT CASE WHEN 'foo' = myvar THEN foo
WHEN 'bar' = myvar THEN bar
WHEN 'baz' = myvar THEN baz
FROM foobarbaz
CROSS JOIN (SELECT ?::text AS myvar) v;
効率的にするクエリのために、エンジンは、クエリプランが大幅にそれに依存する可能性があるため、クエリは、返すしようとしている正確に何列かを知る必要があります。 CASEのような構造で
は、クエリ内の動的性のあるレベルではありますが、クエリプランナは、まだ何列についての考えを持つことができます問合せが実行される前に、一つのケースまたは別のに取得する必要があるかもしれません。真にダイナミックなアプローチでは、列名が別の列、変数またはクエリパラメータから取得されることになっている場合、可能な限り、本当に効率的なクエリプランを作成することは非常に困難です。
したがって、クエリをコンパイルするときに必要なデータについてクエリプランナに知らせる必要があります。したがって、CASE/inline IF/what-have-youを使用するか、両方の列を返し、必要に応じて呼び出し側アプリケーションで2つの間で選択します。
CASE演算子の問題点は何ですか?私は良い解決策が存在するとは思わない。 – alexius