2016-09-03 7 views
0

を照会します。共有コードは、全体で、私はこれらのクエリを考えてみましょう

select * from test_table where id = 1 order by id limit 10 offset 0 
select * from test_table where id = 1 order by name limit 10 offset 0 
select * from test_table where id = 1 order by age limit 10 offset 0 

TEST_TABLEはフィールドid, name, ageを持っていると仮定します。ご覧のように、クエリはほぼ同じですが、唯一の例外はそれらの間の変更によって順序付けされています。私はorder by節をパラメータ化できません。これはサポートされていません。私が書くクエリの数を制限する他の方法はありますか?定義できるビューや、複数のクエリでコードを共有するための他の方法はありますか?

答えて

0

クエリの識別子(基本的にはテーブル名とカラム名)を動的に設定する必要がある場合は、PL/plSQL関数内でクエリを動的に実行するオプションがあります。このようになりますあなたのケースのために:

CREATE FUNCTION my_query(order_col name) RETURNS SETOF test_table AS $$ 
BEGIN 
    RETURN QUERY EXECUTE 
     format('select * from test_table where id = 1 order by %I limit 10 offset 0', order_col); 
END; 
$$ LANGUAGE plpgsql; 

あなたは、テーブルの列名のいずれかを使用して、このようなクエリを使用します。psql

SELECT * FROM my_query('name'); 
0

それができる:

# \set query 'select * from test_table where id = 1 order by :order limit 10 offset 0;' 
# \set order 'id' 
# :query 
(results here ordered by id) 
# \set order 'name desc' 
# :query 
(results here ordered by name desc) 
... 

psqlは、:<name>などのマクロを\setコマンドで指定された値で自動的に置き換えて再帰的に実行します。

また

$ psql -v "query=select * from test_table where id = 1 order by :order limit 10 offset 0;" -v "order=age" 
よう -vオプションを使用してコマンドラインでマクロを指定することができます
関連する問題