すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ケース非依存性

最終更新日:Mar 29, 2026

Oracle SQL を PolarDB for PostgreSQL (Compatible with Oracle) に移行する際、Oracle が識別子を大文字で格納するため、大文字の識別子を参照するクエリは失敗します。これは、PolarDB が引用符なしの識別子を小文字で格納するためであり、両データベースの折りたたみ方向が逆であるためです。ケース非依存性機能はこのギャップを埋めます。この機能を有効にすると、引用符なしの名前、すべて大文字の引用符付きの名前、およびすべて小文字の引用符付きの名前が同等として扱われるため、識別子を書き換えることなく Oracle SQL を PolarDB で実行できます。

識別子の折りたたみ動作

Oracle と PolarDB は、引用符なしの識別子を異なる方法で処理します。

データベース引用符なしの識別子格納形式
Oracletest_tableTEST_TABLE
PolarDB (PostgreSQL)test_tabletest_table

両データベースは、二重引用符付き識別子を記述されたとおりに正確に格納します。これは、Oracle で test_table として作成されたテーブルがストレージでは TEST_TABLE になることを意味しますが、PolarDB で同じステートメントを実行すると test_table が生成されます。そして、"TEST_TABLE" を使用するクエリは、test_tableTEST_TABLE が同じではないため、PolarDB では失敗します。

ケース非依存性機能は、次の3つの識別子形式を同等にすることで、この問題を解決します。

識別子形式機能有効時に同等
引用符なしtest_tableはい
二重引用符付き、すべて大文字"TEST_TABLE"はい
二重引用符付き、すべて小文字"test_table"はい
二重引用符付き、混合ケース"TEST_table"いいえ — 記述されたとおりに格納され、一致します

有効にすると、これら4つのクエリはすべて同じ結果を返します。

SELECT * FROM test_table WHERE "ID" = 10;
SELECT * FROM "TEST_TABLE" WHERE "ID" = 10;
SELECT * FROM TEST_TABLE WHERE "ID" = 10;
SELECT * FROM "test_table" WHERE "ID" = 10;
説明

"TEST_table" のような混合ケースの二重引用符付きの名前は影響を受けません。この機能は、二重引用符付きの名前内のすべての文字が均一に大文字であるか、均一に小文字である場合にのみ適用されます。

サポートされるオブジェクト

ケース非依存性は、以下のすべてのオブジェクトタイプに適用されます。個々のオブジェクトタイプに対して有効にすることはできません。すべてに適用されるか、まったく適用されません。

  • データベース

  • スキーマ

  • テーブル (共通テーブル式 (CTEs)、インデックス、ビュー、マテリアライズドビューを含む)

  • カラム

  • エイリアス

  • 関数 (リビジョンバージョン 2.0.14.26.0 以降)

  • パッケージ

ケース非依存性の有効化または無効化

polar_case_sensitive_for_columnref パラメーターを設定して、この機能を制御します。

動作
onケース非依存性が有効になります
offケース非依存性が無効になります
説明

ケース非依存性は、マイナーバージョン 1.1.24 (2022年7月リリース) 以降に作成されたクラスターではデフォルトで有効になっています。

コンソール経由: ご利用のクラスターのパラメーター設定に移動し、polar_case_sensitive_for_columnref を更新します。

SQL経由:

-- 有効化
SET polar_case_sensitive_for_columnref = on;

-- 無効化
SET polar_case_sensitive_for_columnref = off;

注意事項

既存のクラスターで有効にする前に:

マイナーバージョン 1.1.24 (2022年7月リリース) より前に作成されたクラスターの場合、データベース、スキーマ、テーブル、またはカラムのいずれかが、大文字と小文字のみが異なる名前 (たとえば、id という名前のカラムと ID という名前の別のカラム) を使用しているかどうかを確認してください。このようなクラスターでこの機能を有効にすると、エンジンがこれらの名前を区別できなくなるため、不正確なクエリ結果を返す可能性があります。

曖昧なオブジェクト名を避ける:

名前が文字ケースのみで異なるオブジェクトの命名は避けてください。クエリに、大文字と小文字が異なる同じ文字を持つカラムを持つテーブルが含まれる場合は、<table_name>.<column_name> 表記またはカラムエイリアスを使用してください。

警告

名前が文字ケースのみで異なるオブジェクトがすでに存在するクラスターでケース非依存性を有効にすると、DDLステートメントが意図しないオブジェクトに影響を与える可能性があります。たとえば、"tbl" という名前のテーブルがすでに存在し、後で "TBL" を作成した場合、DROP TABLE "TBL" を実行すると、"tbl""TBL" が同等として扱われるため、両方のテーブルが削除されます。

CREATE TABLE "tbl" (id int);
DROP TABLE "TBL";  -- "tbl" と "TBL" の両方を削除します

テーブル、カラム、およびエイリアス

CREATE TABLE "TEST_TABLE"(id int);
INSERT INTO test_table VALUES(10);

SELECT "T".id FROM "TEST_TABLE" AS t WHERE "ID" = 10;

結果:

 id
----
 10
(1 row)

データベース、スキーマ、および関数

CREATE DATABASE test_database;
\c test_database
CREATE SCHEMA "TEST_SCHEMA";
CREATE FUNCTION "TEST_SCHEMA"."TEST_FUNCTION"(IN i int) RETURNS int AS $$ BEGIN RETURN i; END; $$ LANGUAGE plpgsql;
SELECT "TEST_DATABASE".test_schema.test_function(10) FROM dual;

結果:

 test_function
---------------
            10
(1 row)

パッケージ

CREATE PACKAGE "TEST_PACKAGE" AS
    FUNCTION test_function(i int) RETURN int;
END;

CREATE PACKAGE BODY "TEST_PACKAGE" AS
    FUNCTION test_function(i int) RETURN int
    IS
    BEGIN
        RETURN i;
    END;
END;

SELECT test_package."TEST_FUNCTION"(100) FROM dual;

結果:

 TEST_FUNCTION
---------------
           100
(1 row)

混合ケース名は正規化されません

この機能は、混合ケースの二重引用符付きの名前を正規化しません。二重引用符で囲まれ、小文字と大文字の両方で構成されるオブジェクト名は、この機能の影響を受けません。

CREATE TABLE "TEST_table"(id int);
SELECT * FROM "TEST_table" WHERE "ID" = 10;