私はセッション変数を扱っており、次のことを行うビューを作成したいと考えています:
if (myVar=1)
select * from my_table where X
else
select * from my_table where Y
X と Y は異なる句です。
出来ますか?
これを通常の select ステートメントで実装できますか (またはストアド プロシージャが必要ですか)?
私はセッション変数を扱っており、次のことを行うビューを作成したいと考えています:
if (myVar=1)
select * from my_table where X
else
select * from my_table where Y
X と Y は異なる句です。
出来ますか?
これを通常の select ステートメントで実装できますか (またはストアド プロシージャが必要ですか)?
次のようなことを試してください:
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 いずれかの結果が得られますSELECT
。current_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)
。
私は通常、ストアド プロシージャまたは 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' にインデックスを付けて、このアプローチを高速化できる場合があります。
ストアド プロシージャを使用することをお勧めします。これにより、試行がより明確になります。