将PostgreSQL查询结果存储到Shell或PostgreSQL变量

将PostgreSQL查询结果存储到Shell或PostgreSQL变量,postgresql,shell,Postgresql,Shell,例如,我有一个表存储值: select * from myvalue; val ------- 12345 (1 row) 如何将此12345保存到postgresql或shell脚本中的变量中 以下是我在shell脚本中尝试的内容: var=$(psql -h host -U user -d db <<SQLSTMT SELECT * FROM myvalue; SQLSTMT) 我也试过了 \set var (select * from myvalue) 在psql

例如,我有一个表存储值:

select * from myvalue;

  val
-------
 12345
(1 row)
如何将此12345保存到postgresql或shell脚本中的变量中

以下是我在shell脚本中尝试的内容:

var=$(psql -h host -U user -d db <<SQLSTMT
SELECT * FROM myvalue;
SQLSTMT)
我也试过了

\set var (select * from myvalue)
在psql中,当我键入\设置时,它会列出:

var = '(select*frommyvalue)'

您可以使用psql命令筛选得到的结果:

psql有一个-c/-command=选项从命令行接受SQL,还有一个-t/-tuples-only选项控制输出格式

$ psql -c 'select 1+1'
 ?column? 
----------
        2
(1 row)
$ psql -t -c 'select 1+1'
        2

$ VALUE=`psql -t -c 'select 1+1'`
$ echo $VALUE
2

不,不,不!使用psql中的原始数据开关,如-t或\t,并将查询通过管道传输到psql,而不是解析ascii表,来吧:-

echo 'select * from myvalue;' | psql -t -h host -U user -d db

如果您确实需要解析psql输出,还可以使用-H开关打开HTML输出,并使用一些perl模块解析它以解析HTML表,我使用了一到两次。。此外,对于某些默认值,如未指定时连接的默认数据库,您可能需要使用and。

在本文中,我解释了一种方法,即使用协同进程与psql来回通信。如果您只需要运行一个查询并获得一个结果,那就太过分了,但是如果您正在使用psql编写shell脚本,那就太好了。

这些都不适用于我,但这确实适用于:

median_avm=psql host=${dps1000}port=dbname=@@@user=${reduser}password=${redpass}-c从db.table中选择AVGcolumn-t


使用定义了${dps1000}、${reduser}、${redpass}的源文件,并手动输入port和dbname

,如@scott marlowe所说,-a删除表输出对齐。为单个输出添加该标志。
$ psql -c 'select 1+1'
 ?column? 
----------
        2
(1 row)
$ psql -t -c 'select 1+1'
        2

$ VALUE=`psql -t -c 'select 1+1'`
$ echo $VALUE
2
echo 'select * from myvalue;' | psql -t -h host -U user -d db
var=`psql -Atc "select 1;"`
echo $var
1