在派生的选择或视图中使用列别名会中断简单的选择查询

时间:2012-06-22 14:33:45

标签: select h2

我有一个真正的用例,需要在“where”子句中引用列别名。我正在尝试使用这里概述的技术,我期望在Sybase和MySQL中使用这些技术,但似乎无法在H2或HSQLDB中工作: http://databases.aspfaq.com/database/how-do-i-use-a-select-list-alias-in-the-where-or-group-by-clause.html

如果您愿意尝试重新创建我的问题,请按以下步骤操作:

create table CUSTOMER (code varchar(255), description varchar(255), active bit, accountOpeningDate date, currentBalance numeric(20,6), currentBalanceDigits int)
insert into CUSTOMER (code, description, active, accountOpeningDate, currentBalance, currentBalanceDigits) values ('BMW', 'BMW Motors', 0, '2011-01-01', 345.66, 2)
insert into CUSTOMER (code, description, active, accountOpeningDate, currentBalance, currentBalanceDigits) values ('MERC', 'Mercedes Motors', 1, '2012-02-02', 14032, 0)

然后,此SQL查询失败:

select nest.* from (
  select CODE "id", DESCRIPTION "description",
  ACTIVE "active",
  accountOpeningDate "accountOpeningDate",
  currentBalance "currentBalance"
  from customer
) as nest
where nest.id = 'BMW'

如果剥去“nest.id ='BMW'”,那就没关系了。但是,尝试在where子句或select子句(nest.id而不是next。*)中使用任何别名,则查询失败。错误代码是找不到列“NEST.ID”; ...... [42122-167] 42S22 / 42122

如果您尝试使用别名列名创建视图,然后尝试从视图中进行选择,则会发生同样的故障。例如:

create view customer_view as 
select CODE "id", DESCRIPTION "description", 
ACTIVE "active", 
accountOpeningDate "accountOpeningDate", 
currentBalance "currentBalance" 
from customer

然后:

select id from customer_view

1 个答案:

答案 0 :(得分:4)

问题在于未加引号和引用标识符的混合使用。根据SQL规范,不带引号的标识符(例如id)不区分大小写,数据库可能会将它们转换为大写或小写。引号标识符(例如"id")区分大小写,数据库引擎不得转换标识符。

H2将不带引号的标识符转换为大写(与Oracle等其他数据库引擎一样)。在您的查询中,您使用了带引号和未带引号的标识符。简化测试用例(H2和其他数据库失败):

select * from (select 1 "id") where id = 1

要解决此问题,您需要在任何地方使用带引号的标识符或不带引号的标识符:

select * from (select 1 id) where id = 1

select * from (select 1 "id") where "id" = 1