Oracle データベースから移行する場合や、Oracle 構文を使用するアプリケーションを開発する場合、キーワードを誤って使用すると SQL 構文エラーが発生する可能性があります。これを防ぐために、PolarDB for PostgreSQL (Oracle 互換) はキーワードを予約、列名、関数名の 3 つのカテゴリに分類しています。各カテゴリには特定の使用ルールがあります。これらのルールに従うことで、準拠した SQL を記述し、コードの互換性と標準化を確保できます。
基本原則
柔軟な SQL 構文の互換性を提供するために、PolarDB for PostgreSQL (Oracle 互換) は 3 つのカテゴリのキーワードをサポートしています。これらのカテゴリ間の違いを理解することが、構文エラーを回避するための鍵となります。
予約キーワード: これらはシステムによって予約されている単語です。テーブル名、列名、または関数名として直接使用しないでください。予約キーワードを識別子として使用するには、二重引用符 (
") で囲む必要があります。列名キーワード: これらは列名やテーブル名として使用できますが、一般的なデータの型や関数の名前としては使用できません。
関数名キーワード: これらは関数名として使用できますが、テーブル名や列名としては使用できません。
これらの異なる種類のキーワードを正しく使用することで、構文の競合を回避し、SQL の互換性とコードの標準化を向上させることができます。
キーワードクイックリファレンス
予約キーワード
ALL | ANALYSE | ANALYZE | AND | ANY | ARRAY | AS | ASC | ASYMMETRIC |
BOTH | CASE | CHECK | COLLATE | COLUMN | CONNECT_BY_ROOT | CONSTRAINT | CREATE | CURRENT_CATALOG |
CURRENT_ROLE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER | DEFAULT | DEFERRABLE | DESC | DISTINCT | DO |
ELSE | END | EXCEPT | FALSE | FETCH | FOR | FOREIGN | FROM | GRANT |
GROUP | HAVING | IN | INITIALLY | INTERSECT | INTO | LATERAL | LEADING | LEVEL |
LIMIT | LOCALTIME | LOCALTIMESTAMP | LOOP | MINUS | NOT | NULL | OFFSET | ON |
ONLY | OR | ORDER | PLACING | POLAR_SYS_ROWID_ATTR | PRIOR | REFERENCES | RETURNING | ROWNUM |
SELECT | SESSION_USER | SOME | SYMMETRIC | TABLE | THEN | TO | TRAILING | TRUE |
UNION | UNIQUE | USER | USING | VARIADIC | WHEN | WHERE | WINDOW | WITH |
列名キーワード
BETWEEN | BIGINT | BINARY_DOUBLE | BINARY_FLOAT | BINARY_INTEGER | BIT | BLOB | BOOLEAN | CHAR |
CHARACTER | CLOB | COALESCE | DATETIME | DEC | DECIMAL | EXISTS | FLOAT | GREATEST |
GROUPING | GROUPING_ID | GROUP_ID | INOUT | INT | INTEGER | INTERVAL | LEAST | LONG |
LONGTEXT | MEDIUMTEXT | NATIONAL | NCHAR | NCLOB | NONE | NORMALIZE | NULLIF | NUMBER |
NUMERIC | NVARCHAR | NVARCHAR2 | OUT | OVERLAY | PLS_INTEGER | PRECISION | RAW | REAL |
ROW | SETOF | SMALLINT | SUBSTRING | TIME | TIMESTAMP | TIMESTAMPLTZ | TREAT | TRIM |
UROWID | VALUES | VARCHAR | VARCHAR2 | XMLATTRIBUTES | XMLCONCAT | XMLELEMENT | XMLEXISTS | XMLFOREST |
XMLNAMESPACES | XMLPARSE | XMLPI | XMLROOT | XMLSERIALIZE | XMLTABLE |
関数名キーワード
AUTHORIZATION | BINARY | COLLATION | CONCURRENTLY | CROSS | CURRENT_SCHEMA | FREEZE | FULL | ILIKE |
INNER | IS | ISNULL | JOIN | LEFT | LIKE | NATURAL | NOTNULL | OVERLAPS |
RIGHT | SIMILAR | TABLESAMPLE | VERBOSE |
例: 識別子を正しく使用する方法
以下の例は、キーワードと同じ名前を持つ識別子を処理する際の正しい方法と誤った方法を示しています。
シナリオ 1: テーブル作成時にキーワードを列名として使用する
order という名前の列を含むテーブルを作成します。
正しい使用法
キーワードを二重引用符で囲んで、強制的に識別子として扱わせます。
CREATE TABLE t_order (
id INT PRIMARY KEY,
"order" VARCHAR(50) -- 二重引用符を使用します。
);結果:
CREATE TABLE誤った使用法
キーワードを直接列名として使用すると、構文エラーが発生します。
CREATE TABLE t_order (
id INT PRIMARY KEY,
order VARCHAR(50) -- "order" は予約キーワードです。
);結果:
ERROR: syntax error at or near "order"
LINE 3: order VARCHAR(50)
^シナリオ 2: キーワードで名前が付けられた列からデータをクエリする
t_order テーブルから order 列をクエリします。この列は、名前が二重引用符で囲まれて定義されています。
正しい使用法
列をクエリする際にも、二重引用符を使用する必要があります。
-- サンプルデータを挿入します。
INSERT INTO t_order (id, "order") VALUES (1, 'PolarDB');
-- 正しいクエリ。
SELECT id, "ORDER" FROM t_order;結果:
id | ORDER
----+---------
1 | PolarDB
(1 row)誤った使用法
二重引用符を使用しない場合、データベースは列名をキーワードとして解釈し、列を見つけることができません。
-- 誤った例: 二重引用符がありません。
SELECT id, order FROM t_order;結果:
ERROR: syntax error at or near "order"
LINE 1: SELECT id, order FROM t_order;
^