如何在 psql 中使用脚本变量?

21 浏览
0 Comments

如何在 psql 中使用脚本变量?

在MS SQL Server中,我创建脚本以使用可自定义的变量:

DECLARE @somevariable int  
SELECT @somevariable = -1
INSERT INTO foo VALUES ( @somevariable )

然后,我会根据特定情况下所需的值,在运行时更改@somevariable的值。由于它位于脚本的顶部,所以很容易看到和记住。

在PostgreSQL客户端psql中如何实现相同的功能?

0
0 Comments

在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 ...

0
0 Comments

在使用psql中的脚本变量时,有以下注意事项:

  1. 如果将脚本变量用单引号括起来放在SQL语句中,它们不会被展开。因此以下写法是不起作用的:

    SELECT * FROM foo WHERE bar = ':myvariable'
    

  2. 要在SQL语句中展开为字符串字面量,你必须在变量设置中包含引号。然而,变量值已经被引号包围,这意味着你需要一个第二个引号集,并且内部的引号必须被转义。因此你需要:

    \set myvariable '\'somestring\''  
    SELECT * FROM foo WHERE bar = :myvariable
    

    编辑:从PostgreSQL 9.1开始,你可以改为使用以下写法:

    \set myvariable somestring
    SELECT * FROM foo WHERE bar = :'myvariable'
    

0
0 Comments

如何在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'。最好提供正确的代码。

0