为什么psql无法识别我的单引号?

时间:2016-02-08 13:52:13

标签: postgresql psql

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

错误:列“msft”不存在 第1行:从“Stock_Profile”删除WHERE“符号”= MSFT;

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

它不喜欢'MSFT',''MSFT'或''MSFT''

2 个答案:

答案 0 :(得分:0)

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

正如@imsop所指出的,当从表名和列名中删除双引号时,不保留区分大小写,因此在需要时可以使用反斜杠(\)来转义双引号。

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

答案 1 :(得分:0)

你遇到的问题是你已经用完了各种引号来嵌套;分手了,我们有:

  1. 你的shell需要将一个字符串传递给psql命令;这可以是单引号或双引号
  2. 你的表名是大小写的,所以需要双引号
  3. 您的字符串需要单引号
  4. 在您给出的示例中:

    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,单引号字符串可能不接受任何转义(因此\'没有帮助),但双引号字符串可能会这样做。因此,您可以尝试在外部查询上使用双引号,并在表名称周围转义它们:

    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';