有人能帮我指出这个不需要大脑的WHERE子句有什么问题吗?涉及IT技术。

3

这个查询非常简单,但是我在数据库中做了一些错误的事情。

我有以下查询:

SELECT login FROM accounts WHERE login = "loginname";

当我执行这个查询时,得到的结果如下:
column "loginname" does not exist

这非常简单,为什么这个查询不能正常工作?我有一个登录列,我知道这个用户存在,因为我在Rails控制台中找到了这个人。为什么登录条件将自身称为列?

2
SELECT login FROM accounts WHERE login = 'loginname'; - Lukasz Szozda
3
SQL使用单引号表示字符串:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS - user330315
你已经得到了答案,但我总是告诉人们,单引号表示值,双引号表示标签(别名)。 - Hambone
4个回答

4

如果您正在尝试匹配一个字符串,请尝试使用单引号''

SELECT login FROM accounts WHERE login = 'loginname';

请查看文档
引号包裹的标识符被称为定界标识符或引用标识符。它是由双引号(")包裹一个任意字符序列而形成的。定界标识符总是一个标识符,从不是关键字。因此,“select”可以用来指代名为“select”的列或表,而未加引号的select则会被视为关键字,在期望表或列名的位置使用时会导致解析错误。

2

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

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

1

如果你相信文档,那么看起来双引号是问题所在。字符串值需要使用单引号。


感谢@a_horse_with_no_name。我已经更改了,英语不是我的母语,有时这些错误会悄悄地出现。 - MDschay

0

来自PostgreSQL文档

There is a second kind of identifier: the delimited identifier or quoted identifier. It is formed by enclosing an arbitrary sequence of characters in double-quotes ("). A delimited identifier is always an identifier, never a key word. So "select" could be used to refer to a column or table named "select", whereas an unquoted select would be taken as a key word and would therefore provoke a parse error when used where a table or column name is expected. The example can be written with quoted identifiers like this:

UPDATE "my_table" SET "a" = 5;

Quoted identifiers can contain any character, except the character with code zero. (To include a double quote, write two double quotes.) This allows constructing table or column names that would otherwise not be possible, such as ones containing spaces or ampersands. The length limitation still applies.

所以在你的查询中,"loginname" 和没有引号的 loginname 是一样的 - 它试图引用该名称的列。要将其变成字面字符串,请改用单引号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接