0

私はセッション変数を扱っており、次のことを行うビューを作成したいと考えています:

if (myVar=1)
  select * from my_table where X
else
  select * from my_table where Y

X と Y は異なる句です。

出来ますか?

これを通常の select ステートメントで実装できますか (またはストアド プロシージャが必要ですか)?

4

2 に答える 2

3

次のようなことを試してください:

SELECT 'A'
FROM tableA
WHERE current_setting(setting_name) = 'setting A'
UNION ALL
SELECT 'B'
FROM tableB
WHERE current_setting(setting_name) = 'setting B'

postgresql セッション変数の詳細については、こちらを参照してください。

UPD いずれかの結果が得られますSELECTcurrent_setting(setting_name)最初のクエリと等しい場合は'setting A'結果が返されますが、2 番目のクエリは返されません。

あなたの例では、クエリは次のようになります。

SELECT 'A'
FROM tableA
WHERE myVar = 1
UNION ALL
SELECT 'B'
FROM tableB
WHERE myVar != 1

UPD チェック済み: postgres はクエリを 1 つだけ実行します。EXPLAIN ANALYZEは、2 番目のクエリが計画されていたが としてマークされていることを示しています(never executes)

于 2012-12-05T09:04:18.633 に答える
0

私は通常、ストアド プロシージャまたは UDF を使用します (RDBMS がサポートしている場合)。ビューにはパラメーターを渡すことができないため、ビューは適していません。ただし、このようなビューを作成することで、そのようなことを達成できます

create view MyView as
select 1 as MyVar, * from A
union
select 2 as MyVar, * from B

アプリケーションでMyVar列をフィルタリングします

select * from MyView where MyVar = :MyVar

ただし、これには通常、ビュー全体のテーブル スキャンが含まれます。繰り返しますが、RDBMS によっては、列 'MyVar' にインデックスを付けて、このアプローチを高速化できる場合があります。

ストアド プロシージャを使用することをお勧めします。これにより、試行がより明確になります。

于 2012-12-05T06:47:56.597 に答える