根据查询结果设置PostgreSQL psql变量

使用PostgreSQL的psql命令行工具通过操作员交互或脚本与PostgreSQL数据库进行交互时,通常希望根据特定查询的结果设置psql变量。 尽管PostgreSQL的过程语言PL / pgSQL支持诸如SELECT INTO和赋值(:=)之类的方法来基于查询结果设置PL / pgSQL变量 ,但psql变量赋值不支持这些方法。

进行psql变量赋值的典型方法是使用\set 这允许将psql变量设置为文字值。 但是,在某些情况下,希望根据查询结果设置psql变量。 这是通过psql中的\gset选项完成的。 与psql中的\set操作将具有显式指定名称的变量设置为显式指定的文字值不同, \gset隐式地将psql变量命名为查询返回的列名(如果别名为列,则使用别名)。 \gset已关联。 \gset是在查询后指定的(查询中通常没有分号),并且\gset语句后没有分号(就像在\set语句后不应放置任何分号一样)。

可以更容易地看到\gset如何与代码示例一起工作。 下一个代码清单显示了一个小的psql文件,该文件利用\gset设置了一个名为“ name”的psql变量,该变量由查询设置,该值使用psql的冒号前缀表示法显示,以“回显”其值。

CREATE TABLE person
(
   name text
);

INSERT INTO person (name) VALUES ('Dustin');

SELECT name FROM person \gset
\echo :name

DROP TABLE person;

在前面的代码清单中,第8-9行是此讨论的相关行(其余行用于演示的设置和拆卸)。 第8行包含查询(sans分号),后跟\gset psql变量“ name”由第9行中的值表示,由它设置。在psql终端窗口中,显示此功能的输出如下所示:

CREATE TABLE
INSERT 0 1
Dustin
DROP TABLE

使用psql的\ gset时的其他注意事项

  • 在查询和\gset之间放置分号会影响输出。
      在查询之后和\gset之前放置分号将执行查询并显示查询结果,然后再设置变量。
  • 整个语句后不应有分号,而在\gset之后放置分号将使变量设置混乱。
      错误: invalid command \gset;
  • 用于通过\gset设置变量的查询应恰好返回一行。
      错误: more than one row returned for \gset
  • 当与\gset关联的查询的SELECT子句中的列成为别名时,实际上有两个psql变量名称,通过它们可以访问返回的值。 它们是列名和别名。
      这使psql开发人员可以将预定义列别名为他或她为\gset设置的变量所希望的任何名称。

结论

使用psql时,请使用\set variable_name variable_value显式设置一个psql变量,其名称由第一个参数提供,而第二个参数提供一个关联值。 要基于查询结果设置psql变量,请在查询后附加\gset (通常不使用分号),并按列名(或按列的别名)访问返回的值。

翻译自: https://www.javacodegeeks.com/2015/08/setting-postgresql-psql-variable-based-upon-query-result.html

你可能感兴趣的:(根据查询结果设置PostgreSQL psql变量)