不能在 sqlfiddle 上的选择查询中使用列名 (oracle)



如果我错误地使用sqlfidle或缺少功能,我不是?

重现步骤:

  1. 选择甲骨文选项(左上角)
  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:"产品名称":标识符无效

我的查询是错误的还是在sqlfiddle上无法在选择查询中使用列名?我是否有任何解决方法来继续测试我的查询?

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

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

SQL 小提琴

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

结果

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

    select ProductName from products

给出的错误:

ORA-00904:"产品名称":标识符无效

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

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

因此,列名不是ProductName而是"ProductName"(带双引号)。

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

SQL 小提琴

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

结果

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

在 Oracle 中使用混合大小写名称时,必须始终使用双引号括起来。它假定标识符将全部为大写。

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

select "ProductName" from products

我在双引号" "之间看到您的列名。

当您想要使用特殊的 charecter 为您的列名称授权时,可以使用此功能。

所以你可以使用:

select "ProductName" from products;

最新更新