0

假设 PostgreSQL 10 数据库中的一个表名为“Measurement”,并且(除其他外)有一个名为“Name”的文本类型的列。

我想列出所有具有特定名称的记录,所以 sql 语句:

SELECT * FROM public."Measurement" WHERE "Measurement"."Name" = 'nazwa1';

在 pgAdmin SQL 编辑器中工作正常。

我想向服务器询问相同的问题,但 psql 在 Ubuntu 的命令行中工作,如下所示:

psql --host 127.0.0.1 --dbname BazaDanych --username postgres --port 5432 --echo-all --no-align --command 'SELECT * FROM public."Measurement" WHERE "Measurement"."Name" = 'nazwa1';' --log-file /home/user/wynik.log -o /home/user/dane.csv -P fieldsep=',' -P footer='off'

它不起作用,因为该语句中的单引号不被shell识别,并导致报告为“列不存在”的问题,如下:

public."Measurement" WHERE "Measurement"."Name" = nazwa1

'nazwa1' 字符串不被解释为要与记录进行比较的值,而是作为列名。

我尝试了很多方法,如:\',双引号和许多其他方法,但没有成功。

如何解决这个问题?有人可以纠正我的命令吗?

4

1 回答 1

2

幸运的是,我找到了!

需要两个步骤:

  1. 将外部单引号替换为引号 (' -> ")
  2. 在内部引号之前添加 \ (" -> \")

因此,下面的代码可以正常工作:

psql --host 127.0.0.1 --dbname BazaDanych --username postgres --port 5432 --echo-all --no-align --command "SELECT * FROM public.\"Measurement\" WHERE \"Measurement\".\"Name\" = 'nazwa1';" --log-file /home/user/wynik.log -o /home/user/dane.csv -P fieldsep=',' -P footer='off'

它可能对某人有帮助。如果没有,请管理员删除我的帖子。

于 2018-11-07T10:51:09.510 回答