让我说我有这些疑问:
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 :(得分: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"