PostgreSQLの列名では大文字と小文字が区別されますか?


157

persons列名が言う別のチームから受け継がれたPostgresで、私はdbテーブルを言っています"first_Name"。現在、PGコマンダーを使用して、このcolumn-nameでこのテーブルをクエリしようとしています。

select * from persons where first_Name="xyz";

そしてそれはただ戻る

エラー:列「first_Name」は存在しません

私がばかげたことをしているのか、この問題の回避策がないのかわかりませんか?

回答:


284

二重引用符で囲まれていないすべての識別子(列名を含む)は、PostgreSQLでは小文字に変換されます。二重引用符で作成され、それによって大文字(および/またはその他の構文違反)が保持された列名は、残りの期間は二重引用符で囲む必要があります:("first_Name"

したがって、はい、PostgreSQLの列名では大文字と小文字が区別されます。

SELECT * FROM persons WHERE "first_Name" = 'xyz';

周りの誤った二重引用符も修正します'xyz'(文字列リテラル)は一重引用符で囲みます

マニュアルはこちら。

私の永続的なアドバイスは、合法的な小文字の名前のみを使用することであり、二重引用符は必要ありません。


4
@ArtB:Postgresが実装するように、SQL標準は大文字と小文字を区別しない識別子を定義します。唯一の違い:引用符で囲まれていない識別子は、標準では大文字に変換されますが、pgでは二重引用符で囲まれていないものはすべて小文字になります。(まれなまれなケースにのみ関連します。)詳細はこちらのマニュアルにあります。
Erwin Brandstetter 2014年

1
@adfs:自分が説明した以上にうまく説明できるとは思いません。詳細については、繰り返し提供したマニュアルへのリンクをたどってください。
Erwin Brandstetter 2014年

15
@adfs:ではSQL、 foobarFOOBARFooBar同じ識別子です。しかし"foobar""FooBar"および"FOOBAR"異なる識別子がある
a_horse_with_no_name

5
@a_horse_with_no_nameはい、ただしSQLでfoobarFOOBAR同じです"FOOBAR"。potgresql FOOBARfoobarなどはと同じ"foobar"です。
Jasen 2016年

1
@KamelMili:必要な情報をすべて提供し、質問として質問することをお勧めします。コメントは場所ではありません。いつでもこの回答にリンクして状況を把握できます。また、関連する質問へのリンクをここにコメントとして残すことができます(私の注意を引くためにも)。
Erwin Brandstetter 16年

16

ドキュメントを引用するには:

キーワードと引用符で囲まれていない識別子は、大文字と小文字を区別しません。したがって:

UPDATE MY_TABLE SET A = 5;

同様に次のように書くことができます:

uPDaTE my_TabLE SeT a = 5;

引用符で囲まれた識別子を使用してそれを書くこともできます

UPDATE "my_table" SET "a" = 5;

識別子を引用すると大文字と小文字が区別されますが、引用符で囲まれていない名前は常に小文字に変換されます(引用符で囲まれていない名前が大文字に変換されるSQL標準とは異なります)。例えば、識別子はFOOfoo、および"foo"PostgreSQLで同一と見なされるが、"Foo"及び"FOO"これら三つの互いに異なります。

ポータブルアプリケーションを作成する場合は、常に特定の名前を引用するか、絶対に引用しないことをお勧めします。


8

大文字と小文字が混在する列名は、PostgresQLで二重引用符で囲む必要があります。そのため、最善の慣例は、すべての小文字にアンダースコアを付けることです。


2
@ erwin-brandstetterによる説明によると、これは正しくありません
Michael Silver

9
これはどのように間違っていますか?大文字と小文字が混在する列名がある場合、それらを参照するには、識別子を二重引用符で囲む必要があります。
theferrit32 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.