2

「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'

「wherenest.id='BMW'」を削除しても問題ありません。ただし、where句またはselect句(next。*ではなくnest.id)のいずれかでエイリアスを使用しようとすると、クエリは失敗します。エラーコードは列「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
4

1 に答える 1

5

問題は、引用符なしの識別子と引用符付きの識別子が混在していることです。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
于 2012-06-22T17:57:09.350 に答える