【问题标题】:Can't use column names in select query on sqlfiddle (oracle)无法在 sqlfiddle(oracle)上的选择查询中使用列名
【发布时间】:2018-02-27 00:13:13
【问题描述】:

如果我使用 sqlfile 不正确或者缺少功能,我不是?

重现步骤:

  1. 选择 oracle 选项(左上角)
  2. 创建表并插入数据:

    CREATE TABLE products
    ("P_Id" int, "ProductName" varchar2(10), "UnitPrice" numeric, "UnitsInStock" int, "UnitsOnOrder" int)
    //
    
    INSERT ALL 
    INTO products ("P_Id", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder")
     VALUES (1, 'Jarlsberg', 10.45, 16, 15)
    INTO products ("P_Id", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder")
     VALUES (2, 'Mascarpone', 32.56, 23, NULL)
    INTO products ("P_Id", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder")
     VALUES (3, 'Gorgonzola', 15.67, 9, 20)
    SELECT * FROM dual
    //
    
  3. 构建架构

  4. 运行查询并验证结果是否正确

    select * from products
    
  5. 使用列名 (any) 运行查询并得到错误:

    select ProductName from products
    

给出的错误:

ORA-00904:“PRODUCTNAME”:标识符无效

我的查询是错误的还是在 sqlfiddle 上无法使用 select 查询中的列名?我有什么变通方法来继续测试我的查询吗?

【问题讨论】:

    标签: oracle select sqlfiddle


    【解决方案1】:

    [TL;DR] The simplest thing 要做的就是永远不要在对象名称周围使用双引号,而让 oracle 以默认方式管理区分大小写。

    但是,您可以在 SQLFiddle 中使用双引号:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE products
    ("P_Id" int, "ProductName" varchar2(10), "UnitPrice" numeric, "UnitsInStock" int, "UnitsOnOrder" int)
    //
    
    INSERT ALL 
    INTO products ("P_Id", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder")
     VALUES (1, 'Jarlsberg', 10.45, 16, 15)
    INTO products ("P_Id", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder")
     VALUES (2, 'Mascarpone', 32.56, 23, NULL)
    INTO products ("P_Id", "ProductName", "UnitPrice", "UnitsInStock", "UnitsOnOrder")
     VALUES (3, 'Gorgonzola', 15.67, 9, 20)
    SELECT * FROM dual
    //
    

    查询 1

    SELECT "ProductName" FROM products
    

    Results

    | ProductName |
    |-------------|
    |   Jarlsberg |
    |  Mascarpone |
    |  Gorgonzola |
    
    1. 使用列名 (any) 运行查询并得到错误:

      select ProductName from products

    给出的错误:

    ORA-00904:“PRODUCTNAME”:标识符无效

    默认情况下,Oracle 数据库区分大小写;但是,默认情况下,它们还会将所有内容都转换为大写,以便从您(用户)那里抽象出区分大小写。只有当您使用双引号时,Oracle 才会使用您为标识符指定的大小写。

    由于您在 CREATE TABLE 语句中使用了带引号的标识符,因此您还需要在 SELECT 语句中使用带引号的标识符,并且与创建表时使用的完全相同。

    所以,列名不是ProductName,而是"ProductName"(带双引号)。

    更好的解决方案是不使用双引号:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE products(
      P_Id         int,
      ProductName  varchar2(10),
      UnitPrice    numeric,
      UnitsInStock int,
      UnitsOnOrder int
    )
    //
    
    INSERT INTO products ( P_Id, ProductName, UnitPrice, UnitsInStock, UnitsOnOrder )
      SELECT 1, 'Jarlsberg', 10.45, 16, 15 FROM DUAL UNION ALL
      SELECT 2, 'Mascarpone', 32.56, 23, NULL FROM DUAL UNION ALL
      SELECT 3, 'Gorgonzola', 15.67, 9, 20 FROM DUAL
    //
    

    查询 1

    SELECT ProductName FROM products
    

    Results

    | PRODUCTNAME |
    |-------------|
    |   Jarlsberg |
    |  Mascarpone |
    |  Gorgonzola |
    

    【讨论】:

      【解决方案2】:

      在 Oracle 中,当您使用大小写混合的名称时,您必须始终在它们周围使用双引号。它假定标识符都是大写的。

      因此,要访问名为 ProductName 的列,您应该运行:

      select "ProductName" from products
      

      【讨论】:

      • 然后我收到此错误ORA-00911: invalid character,请在 sqlfiddle 中测试,因为这是我的问题,而不是使用 oracle 本身
      • 你是如何将 SQL 输入到 sqlfiddle 中的,以上对我来说很好用。您是否使用不使用普通“”字符的编辑器? Windows上的东西?尝试复制我的回答中的陈述
      【解决方案3】:

      我在双引号“”之间看到了您的列名。

      当您想用特殊字符为列名赋予权利时,可以使用此选项。

      所以你可以使用:

      select "ProductName" from products;
      

      【讨论】:

      • 然后我收到此错误ORA-00911: invalid character,请在 sqlfiddle 中测试,因为这是我的问题,而不是使用 oracle 本身
      猜你喜欢
      • 1970-01-01
      • 2016-10-08
      • 2012-07-04
      • 2021-11-01
      • 1970-01-01
      • 2020-06-13
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多