【问题标题】:Why do you only need double quotation marks in SQL for particular cases?为什么在特定情况下只需要 SQL 中的双引号?
【发布时间】:2020-12-14 07:44:23
【问题描述】:

我的数据库表中有一个名为UID 的列。由于某种原因,除非我用双引号 (" ") 将列名括起来,否则查询会失败。其他列都不需要这些引号。

例如,这不起作用:
SELECT user_name FROM user_table WHERE UID = '...'
但这确实:
SELECT user_name FROM user_table WHERE "UID" = '...'

UID 是某种关键字吗?为什么它只发生在该列?我如何知道是否需要对其他列使用双引号?

顺便说一下,我正在运行 JDK 1.8_221 并使用 oracle JDBC 驱动程序,如果这有影响的话。

【问题讨论】:

标签: sql oracle


【解决方案1】:

是的,它是关于关键字的。您可以将所有内容(表格、列)双引号以避免这种情况,但我可以理解您不想这样做。

拥有标准关键字列表:SQL Keywords 但是您可以看到 UID 不在此列表中,因为我认为它是您的数据库实现的保留关键字。我对一个名为“订单”的表有同样的问题,因为它包含订单。 ORDER 是一个关键字,所以我每次都必须引用它。

最好使用 SQL 客户端工具测试您的语句。

既然你提到了Oracle:Oracle keywords:“你可以通过查询V$RESERVED_WORDS数据字典视图来获取关键字列表。”

【讨论】:

  • 用双引号将对象名称括起来也使它们区分大小写,允许使用空格,并允许使用更广泛的字符。
  • 也许ORDERS 会得到一个更好的名字;)
  • @William 我从不在表名中使用复数,但也许这更像是宗教而非科学 (stackoverflow.com/questions/338156/…)
  • 回到我刚开始的时候,我了解到实体是单数的(医生/病人),表格是复数的(医生/病人)。作为副作用,这往往会避免使用关键字。然而,惯例的潮流似乎在 90 年代发生了转变,现在每个人都认为相反是正确的(至少在表格方面——我认为没有人知道 ERM 是什么了)。
【解决方案2】:

如果您为user_table 创建表的命令如下所示:

create table user_table ("UID" varchar2(10))

那么您将不得不在查询中使用 UID 周围的引号。这个查询:

select * from user_table where UID = 'somestring'

表示使用Oraclepredefined UID pseudo column,不会访问你表的UID列。

如果您的表没有用户定义的 UID 列,那么使用 "UID" 应该会失败。

我的猜测是您的表确实有一个 UID 列,当您说它“不起作用”而不使用引号时,您可能意味着它激发了 ORA-1722。

当使用不带引号的 UID 时,失败的类型取决于字符串 'somestring' 的内容。如果该字符串的内容可以转换为数字,那么您可能不会得到您期望的行。如果不能将其转换为数字,那么您将获得 ORA-1722。

顺便说一句,如果你尝试执行这个,那么你会得到一个 ORA-904:

create table user_table (UID number) 

【讨论】:

    【解决方案3】:

    是的,是关键字,返回

    UID 返回唯一标识会话用户的整数( 登录的用户)。

    默认情况下,Oracle 标识符(表名、列名等)不区分大小写。您可以在创建它们时使用引号将它们区分大小写(例如:SELECT * FROM "My_Table" WHERE "my_field" = 1)。 SQL 关键字 (SELECT, WHERE, JOIN, etc.) 始终不区分大小写。

    您可以使用它获取更多信息here

    【讨论】:

      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      相关资源
      最近更新 更多