8

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

select * from myvalue;

  val
-------
 12345
(1 row)

如何将其保存12345到 postgresql 或 shell 脚本中的变量中?

这是我在我的 shell 脚本中尝试的:

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

echo $var给了我:

val ------- 12345 (1 row)

我也试过

\set var (select * from myvalue)

在 psql 中,当我键入\set它时列出:

var = '(select*frommyvalue)'
4

6 回答 6

12

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

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

如果你真的需要解析 psql 输出,你也可以使用 -H 开关(打开 HTML 输出),并用一些 perl 模块来解析它来解析 html 表,我用过一次或两次。另外,你可能想要使用pgpass 文件~/.psqlrc一些默认值,如默认连接的数据库,当未指定时。

于 2012-09-21T18:08:13.970 回答
6

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
于 2012-09-21T18:07:26.237 回答
4
var=`psql -Atc "select 1;"`
echo $var
1
于 2012-09-22T03:00:44.327 回答
2

这个答案中,我解释了一种方法,使用协同进程与psql. 如果您只需要运行一个查询并获得一个结果,那就太过分了,但如果您使用psql.

于 2012-09-21T23:56:33.450 回答
1

您可以过滤使用psql命令获得的结果:

var=$(psql -h host -U user -d db <<SQLSTMT
SELECT * FROM myvalue;
SQLSTMT)
var=$(cut -d' ' -f3 <<<$var)
于 2012-09-21T18:06:57.173 回答
0

这些都不适合我,但这确实:

中值avm=psql "host=${dps1000} port=#### dbname=@@@ user=${reduser} password=${redpass}" -c "SELECT AVG(column) FROM db.table;" -t

使用定义了 ${dps1000}、${reduser}、${redpass} 的源文件并手动输入端口和数据库名

于 2018-08-02T20:18:46.213 回答