はじめに
PostgreSQLでは、シングルクォートとダブルクォートが異なる目的で使用されます。これらのデータベースでの作業を開始する際、これら2種類の引用符の違いと正しい使用方法を理解するのは難しい場合があります。
このガイドでは、PostgreSQLがシングルクォートとダブルクォートをどのように解釈するかを見ていきます。さまざまな引用符を使用した場合の副作用について説明し、それぞれが使用されるシナリオの例を提供します。
ダブルクォート
PostgreSQLでは、ダブルクォート(例: "a red dog")は常に*区切り識別子*を示すために使用されます。この文脈において、*識別子*とは、テーブル名やカラム名など、PostgreSQL内のオブジェクトの名前です。区切り識別子とは、開始と終了が明確にマークされた識別子のことです。
例えば、customer
テーブルからすべての情報を選択するには、次のように入力します。ここでは、テーブル名がダブルクォートで囲まれています。
SELECT * FROM "customer";
ダブルクォートは識別子を示しますが、すべての識別子がダブルクォートを使用するわけではありません。上記のような例では、識別子が完全に引用符なしで記述されている方がはるかに一般的です。
SELECT * FROM customer;
識別子の引用と大文字・小文字の区別の問題
上記の2つの形式はどちらもcustomer
テーブルで正しく機能しますが、重要な違いがあります。
引用符なしの識別子(2番目のバージョンなど)は、*大文字・小文字を区別しません*。これは、PostgreSQLがcustomer
、Customer
、CUSTOMER
を同じオブジェクトとして認識することを意味します。
しかし、引用符で囲まれた識別子は*大文字・小文字を区別します*。このため、PostgreSQLは"CUSTOMER"
と"customer"
を全く異なるオブジェクトとして扱います。
この違いにより、PostgreSQL内で通常は合法ではない識別子を作成することができます。例えば、名前にピリオドを含むカラムを作成する必要がある場合、PostgreSQLが正しく解釈するようにダブルクォートを使用する必要があります。
ただし、注意して使用しないと、使いやすさの問題につながる可能性があることに留意してください。例えば、オブジェクトを作成する際に識別子の大文字を保持するためにダブルクォートを使用するとします。その場合、それ以降、そのオブジェクトを参照するたびに、その大文字と小文字を一致させるためにダブルクォートを使用する必要があります。
互換性を高めるため、特にオブジェクトを作成する際にはダブルクォートの使用を控えめにしてください。ダブルクォートを使用したい場合は、完全に小文字の識別子でダブルクォートを使用すれば、大文字・小文字の問題は発生しないことに留意してください。
シングルクォート
一方、シングルクォートは、トークンが文字列であることを示すために使用されます。これはPostgreSQL全体でさまざまな文脈で使用されます。
一般に、項目が文字列である場合は、シングルクォートで囲む必要があります。オブジェクトを作成および参照する際、識別子は引用符なしのテキストまたはダブルクォートで囲まれたテキストで表す必要があることに留意してください。
例えば、ここではシングルクォートを使用して、データベース内のtext
フィールドに文字列を挿入します。
INSERT INTO my_table(text) VALUES ('hello there!');
必要であれば、識別子をダブルクォートで囲むこともできます。
INSERT INTO "my_table"("text") VALUES ('hello there!');
上記の2つのステートメントは、my_table
とtext
カラムの両方が作成時に引用符なしまたは小文字であったと仮定すれば、同じです。
文字列*内に*シングルクォートを含める必要がある場合は、代わりに2つの連続したシングルクォート(ダブルクォートではなく、シングルクォート2つ)を挿入することで実現できます。
例えば、埋め込みシングルクォートを含む別の文字列を次のように入力して挿入できます。
INSERT INTO my_table(text) VALUES ('How''s it going?');
シングルクォートで囲まれた文字列は、文字列の値を割り当てたりチェックしたりする適切な手段です。
その他の例
ここでは、SQLステートメントの異なる部分でなぜ異なる引用符付けの方法が使われるのかを明確にするために、いくつかの例をさらに見ていきます。
パスワード付きで新しいロールを作成する
まず、ロール作成ステートメントを見てみましょう。
CREATE ROLE "user1" WITH LOGIN PASSWORD 'secretpassword';
このステートメントには、2つの引用符付きコンポーネントがあります。
user1
はロールを参照するため、識別子であるためダブルクォートで囲まれています。secretpassword
はテーブルの列に存在する文字列です。したがって、文字列値であり、シングルクォートが必要です。
現在のユーザーがロール管理に必要な権限を持っているか確認する
次のクエリは、現在ユーザーがサインインしているロールが、データベースクラスター内でロールを管理する権限を持っているかどうかを判断します。
SELECT 'Yes' AS "Can I manage roles?" FROM pg_roles WHERE rolname = :'USER' AND (rolsuper OR rolcreaterole);
ここでは、いくつかの異なる引用符付けのパターンが使用されています。
Yes
は、カラム値のコンテキスト内で表示される値であるため、シングルクォートで囲まれています。Can I manage roles?
は、構築されたテーブルのカラム名となるため、識別子であり、ダブルクォートで囲まれています。USER
は、文字列の値をチェックしているため、シングルクォートで囲まれています。:'USER'
構文は、psql
のUSER
変数を補間し、結果の値をシングルクォートで囲むために使用される特殊な形式です。
まとめ
このガイドでは、PostgreSQLにおけるシングルクォートとダブルクォートの両方について説明しました。ダブルクォートは、テーブル、カラム名、ロールなどのデータベース内の識別子を示すために使用されます。対照的に、シングルクォートは文字列リテラルを示すために使用されます。
PostgreSQLで引用符を正しく使用する方法、および異なる引用符の選択肢が持つ意味を学ぶことは、イライラするような間違いを避けるのに役立ちます。引用符のルールは、あなたが慣れている他のシステムとは異なるかもしれませんが、その明確な目的を理解すれば役立つでしょう。
Prismaを使用してPostgreSQLデータベースを管理している場合、引用符のタイプはデータベースに送信される前に自動的に解決されます。ただし、生クエリを使用している場合は例外で、PostgreSQLが異なる種類の引用符をどのように解釈するかを混同しないように、ここで説明されている情報に注意を払う必要があります。