为什么 psql 不能识别我的单引号?

Why does psql not recognise my single quotes?

$ psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c 'DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT'; '

错误:列 "msft" 不存在 第 1 行:从 "Stock_Profile" 中删除 "Symbol" = MSFT;

如何向 psql 显示 MSFT 是一个字符串?

它不喜欢 'MSFT'、\'MSFT\' 或 ''MSFT''

这是因为就 psql 而言,MSFT 之前的单引号终止了字符串。

正如@imsop 指出的那样,从 table 名称和列名称中删除双引号时不会保留区分大小写,因此您可以在需要时使用反斜杠 (\) 转义双引号.

psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c "DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT';"

您遇到的问题是 运行 没有可嵌套的引号类型;分开,我们有:

  1. 您的 shell 需要将单个字符串传递给 psql 命令;这可以是单引号或双引号
  2. 您的 table 名称是大小写混合的,因此需要用双引号引起来
  3. 您的字符串需要用单引号引起来

在你给出的例子中:

psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c 'DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT'; '

shell 看到两个单引号字符串:

  • 'DELETE FROM "Stock_Profile" WHERE "Symbol" = '
  • `'; '

所以问题不在psql,而在shell本身。

根据您使用的 shell,单引号字符串可能不接受任何转义(因此 \' 没有帮助)但双引号字符串可能会。因此,您可以尝试在外部查询上使用双引号,并在 table 名称周围转义它们:

psql -E --host=xxx --port=yyy --username=chi --dbname=C_DB -c "DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT'; "

现在 \" 不会结束字符串,因此 shell 会将其视为单个字符串:

"DELETE FROM \"Stock_Profile\" WHERE \"Symbol\" = 'MSFT'; "

并将其传递到 psql 并处理转义,从而得到所需的 SQL:

DELETE FROM "Stock_Profile" WHERE "Symbol" = 'MSFT';