跨查询共享代码

时间:2016-09-03 02:24:47

标签: sql postgresql postgresql-9.3

让我说我有这些疑问:

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子句,因为不支持。有没有其他方法来限制我写的查询数量。是否有我可以定义的视图或其他方式来跨多个查询共享代码?

2 个答案:

答案 0 :(得分: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;

然后使用表格中的任何列名称来使用这样的查询:

SELECT * FROM my_query('name');

答案 1 :(得分:0)

psql中可能是:

# \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命令指定的值并递归执行。

您还可以使用-v选项(如

)在命令行中指定宏
$ psql -v "query=select * from test_table where id = 1 order by :order limit 10 offset 0;" -v "order=age"