如何在 psql 中使用脚本变量?
在psql中如何使用脚本变量?
使用WITH子句可以尝试解决这个问题。
WITH vars AS (SELECT 42 AS answer, 3.14 AS appr_pi) SELECT t.*, vars.answer, t.radius*vars.appr_pi FROM table AS t, vars;
这种方式在查询中多次使用相同计算值时非常方便。
与Bryce的报告相反,这对我来说似乎工作得很好。
CREATE TABLE test (name VARCHAR, age INT); INSERT INTO test (name, age) VALUES ('Jack', 21), ('Jill', 20); WITH vars AS (SELECT N'Jack' AS name, 21 AS age) SELECT test.* FROM test, vars WHERE test.name = vars.name and test.age = vars.age;
输出了Jack和Jack的年龄,如预期所示。
对于许多用途,特别是在像Python Flask这样的Web应用程序框架的上下文中,这是在单个查询中重用复杂计算值的最佳解决方案。
有人能否建议如何在插入操作中使用这种方法?
尝试将vars添加到FROM子句中:
... from users, vars where ...
在使用psql中的脚本变量时,有以下注意事项:
- 如果将脚本变量用单引号括起来放在SQL语句中,它们不会被展开。因此以下写法是不起作用的:
SELECT * FROM foo WHERE bar = ':myvariable'
- 要在SQL语句中展开为字符串字面量,你必须在变量设置中包含引号。然而,变量值已经被引号包围,这意味着你需要一个第二个引号集,并且内部的引号必须被转义。因此你需要:
\set myvariable '\'somestring\'' SELECT * FROM foo WHERE bar = :myvariable
编辑:从PostgreSQL 9.1开始,你可以改为使用以下写法:
\set myvariable somestring SELECT * FROM foo WHERE bar = :'myvariable'
如何在psql中使用脚本变量?
在psql中,可以通过\set命令创建变量,例如:
\set myvariable value
然后可以将其作为替代使用,例如:
SELECT * FROM :myvariable.table1;
或者
SELECT * FROM table1 WHERE :myvariable IS NULL;
在较旧版本的psql客户端中,如果要将变量用作条件字符串查询中的值,例如:
SELECT * FROM table1 WHERE column1 = ':myvariable';
那么你需要在变量本身中包含引号,因为上述方法不起作用。可以这样定义变量:
\set myvariable 'value'
然而,如果你遇到了从现有变量生成字符串的情况,可以使用以下技巧:
\set quoted_myvariable '\'' :myvariable '\''
现在你有了一个带引号和不带引号的相同字符串的变量!你可以做这样的事情:
INSERT INTO :myvariable.table1 SELECT * FROM table2 WHERE column1 = :quoted_myvariable;
需要注意的是,\set命令只适用于psql工具,不能在存储过程中使用。
截至postgresql 9.1版本,在psql中可以使用:'variable'来正确引用变量作为值,或者使用:"variable"将其用作标识符。
还有一种方法是使用$进行引用:
\set quoted_myvariable $$':myvariable'$$
还可以使用数组进行变量赋值:
\set args $$'{"text", "text", "text", "text"}'$$::text[]
与
\set args ARRAY[$$'text'$$, $$'text'$$, $$'text'$$, $$'text'$$]相同
需要注意的是,不建议使用不起作用的代码,例如':myvariable'。最好提供正确的代码。