PostgreSQL / 短いガイド

PostgreSQLでシングルクォートとダブルクォートを使用する方法

シェア

はじめに

PostgreSQLでは、シングルクォートとダブルクォートは異なる目的で使用されます。これらのデータベースを使い始めたばかりの頃は、これら2種類の引用符の違いと、それらを正しく使用する方法を理解するのが難しい場合があります。

このガイドでは、PostgreSQLがシングルクォートとダブルクォートの両方をどのように解釈するかを見ていきます。さまざまな引用符を使用した場合の副作用について説明し、それぞれの引用符が使用されるシナリオの例を示します。

ダブルクォート

PostgreSQLでは、ダブルクォート(例:「a red dog」)は常に*区切り識別子*を示すために使用されます。このコンテキストでは、*識別子*は、テーブル名や列名など、PostgreSQL内のオブジェクトの名前です。区切り識別子は、明確にマークされた開始と終了を持つ識別子です。

たとえば、customerテーブルからすべての情報を選択するには、次のように入力できます。ここでは、テーブル名がダブルクォートで囲まれています。

SELECT * FROM "customer";

ダブルクォートは識別子を示しますが、すべての識別子がダブルクォートを使用するわけではありません。上記の例のように、識別子は引用符で囲まれていない方が一般的です。

SELECT * FROM customer;

識別子の引用符と大文字と小文字の区別の問題

上記の2つの形式はどちらもcustomerテーブルで正しく機能しますが、重要な違いがあります。

引用符で囲まれていない識別子(2番目のバージョンなど)は*大文字と小文字を区別しません*。これは、PostgreSQLがcustomerCustomer、および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_tabletext列の両方が作成時に引用符で囲まれていないか、小文字であったと仮定します。

文字列*内*にシングルクォートを含める必要がある場合は、代わりに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で引用符を正しく使用する方法と、さまざまな引用符の選択肢の意味を学ぶことは、イライラする間違いを避けるのに役立ちます。引用符のルールは、使い慣れている他のシステムに対応していない可能性がありますが、それらの明確な目的を理解すれば役立ちます。

著者について
Justin Ellingwood

Justin Ellingwood

Justinは2013年からデータベース、Linux、インフラストラクチャ、および開発者ツールについて執筆しています。彼は現在、妻と2匹のウサギと一緒にベルリンに住んでいます。彼は通常、三人称で書く必要はありません。これは関係者全員にとって安心です。