【问题标题】:Column doens't exists in PostgreSQL (WHERE column_name = column_value) [duplicate]PostgreSQL中不存在列(WHERE column_name = column_value)[重复]
【发布时间】:2021-04-30 04:24:32
【问题描述】:

我在 PostgreSQL 中有下表:

id 和 Grade 是 INT,note 和 subject 都是 VARCHAR

当我运行命令时:

SELECT * FROM grades 
WHERE subject = "latin";

我收到以下错误:

在 pgAdmin4 中: 错误:列“拉丁”不存在 第 2 行:主题 = “拉丁语” ^ SQL 状态:42703 性格:37

在 cmd 中: 错误:列“拉丁”不存在 第 1 行:SELECT * FROM upisi WHERE subject = "latin";

我来自 MySQL,所以我认为这可行。 如果我在 WHERE 子句中加入grade = something,效果很好。知道为什么会这样吗?

【问题讨论】:

标签: sql postgresql string-constant


【解决方案1】:

字符常量需要单引号。 (双引号用于引用标识符)


SELECT * FROM grades 
WHERE subject = 'latin';

如果您使用WHERE subject = "latin",DBMS 期望“latin”是一个列名,但事实并非如此。

【讨论】:

    【解决方案2】:

    这就像错误类型的引号一样简单。你想要的:

    SELECT * FROM grades 
    WHERE subject = 'latin';
    

    解释一下:

    • 单引号,如 'latin',是在标准 SQL 中编写字符串的标准方法,应该适用于所有 DBMS。
    • 在 Postgres 和其他一些 DBMS 中,双引号是一种引用标识符的方式 - 因此,如果您的列名由于某种原因有空格(没有很多 这样做的理由,但可能),那么你可以写SELECT * FROM grades WHERE "subject name" = 'latin' - "subject name" 是列的名称,'latin' 是一个字符串。

    虽然双引号在 SQL 标准中,但其他 DBMS 使用不同的语法来引用标识符,因此可以将双引号视为写入字符串的替代方法。

    -- Postgres (also works in Microsoft SQL Server, but isn't the default style)
    SELECT * FROM grades WHERE "subject name" = 'latin'
    -- MySQL
    SELECT * FROM grades WHERE `subject name` = 'latin'
    -- Microsoft SQL Server
    SELECT * FROM grades WHERE [subject name] = 'latin'
    

    但如果你总是对字符串使用单引号,并避免 需要引用的名称,你会遇到更少的问题。

    -- Works pretty much everywhere
    SELECT * FROM grades WHERE subject = 'latin'
    

    【讨论】:

    • 标识符的双引号也在SQL标准中定义。
    • @a_horse_with_no_name 当然可以,但是除非您正在设计一个新的 DBMS,否则了解 DBMS 实际支持的内容并没有那么有用。也就是说,SQL Server 确实支持它作为替代方案,即使它不是由其内置工具生成的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2010-09-25
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    相关资源
    最近更新 更多