有人可以帮我指出这个没有脑子的WHERE子句有什么问题吗?

时间:2015-12-17 14:11:05

标签: sql postgresql select syntax-error

这很简单,但不知怎的,我在我的数据库上对这个查询做错了。

我在下面有这个查询:

SELECT login FROM accounts WHERE login = "loginname";

当我执行此查询时,我得到的结果是:

column "loginname" does not exist

这是一个没脑子的问题,为什么这个查询不能正常工作?我有一个登录列,我知道这个用户存在,因为我找到了这个人与rails控制台。为什么登录标准将自己称为列?

4 个答案:

答案 0 :(得分:4)

如果您要匹配字符串

,请尝试使用单引号''
SELECT login FROM accounts WHERE login = 'loginname';

检查documentation

  

还有第二种标识符:分隔标识符或   引用标识符。它是通过包围任意序列形成的   双引号(“)中的字符。分隔标识符始终是   标识符,永远不是关键字。 所以“select”可以用来指代a   名为“select”的列或表,而未加引号的选择将是   作为关键词,因此会引发解析错误   用于需要表名或列名的地方。

答案 1 :(得分:2)

双引号(")用于引用对象名称,区分大小写。在这种情况下,"loginname"被解释为列名,查询失败,因为没有这样的列。要引用字符串文字,您应该使用单引号('):

SELECT login FROM accounts WHERE login = 'loginname';
-- Here ---------------------------------^---------^

答案 2 :(得分:1)

似乎" "是believe the documentation的问题。字符串值需要单引号。

答案 3 :(得分:0)

来自PostgreSQL Documentation

  

还有第二种标识符:分隔标识符或带引号的标识符。它是通过用双引号(")括起任意字符序列而形成的。分隔标识符始终是标识符,而不是关键字。所以"选择"可用于引用名为" select"的列或表,而不带引号的select将被视为关键字,因此在预期使用表或列名称时会引发解析错误。该示例可以使用带引号的标识符编写,如下所示:

UPDATE "my_table" SET "a" = 5;
     

带引号的标识符可以包含任何字符,但代码为零的字符除外。 (要包含双引号,请写两个双引号。)这允许构造原本不可能的表名或列名,例如包含空格或符号的名称。长度限制仍然适用。

因此,在您的查询中"loginname"与没有引号的loginname相同 - 它试图引用具有该名称的列。要使其成为文字字符串,请改用单引号。