persons
列名が言う別のチームから受け継がれたPostgresで、私はdbテーブルを言っています"first_Name"
。現在、PGコマンダーを使用して、このcolumn-nameでこのテーブルをクエリしようとしています。
select * from persons where first_Name="xyz";
そしてそれはただ戻る
エラー:列「first_Name」は存在しません
私がばかげたことをしているのか、この問題の回避策がないのかわかりませんか?
persons
列名が言う別のチームから受け継がれたPostgresで、私はdbテーブルを言っています"first_Name"
。現在、PGコマンダーを使用して、このcolumn-nameでこのテーブルをクエリしようとしています。
select * from persons where first_Name="xyz";
そしてそれはただ戻る
エラー:列「first_Name」は存在しません
私がばかげたことをしているのか、この問題の回避策がないのかわかりませんか?
回答:
二重引用符で囲まれていないすべての識別子(列名を含む)は、PostgreSQLでは小文字に変換されます。二重引用符で作成され、それによって大文字(および/またはその他の構文違反)が保持された列名は、残りの期間は二重引用符で囲む必要があります:("first_Name"
)
したがって、はい、PostgreSQLの列名では大文字と小文字が区別されます。
SELECT * FROM persons WHERE "first_Name" = 'xyz';
周りの誤った二重引用符も修正します'xyz'
。値(文字列リテラル)は一重引用符で囲みます。
私の永続的なアドバイスは、合法的な小文字の名前のみを使用することであり、二重引用符は必要ありません。
foobar
、FOOBAR
とFooBar
同じ識別子です。しかし"foobar"
、"FooBar"
および"FOOBAR"
異なる識別子がある
foobar
とFOOBAR
同じです"FOOBAR"
。potgresql FOOBAR
でfoobar
などはと同じ"foobar"
です。
ドキュメントを引用するには:
キーワードと引用符で囲まれていない識別子は、大文字と小文字を区別しません。したがって:
UPDATE MY_TABLE SET A = 5;
同様に次のように書くことができます:
uPDaTE my_TabLE SeT a = 5;
引用符で囲まれた識別子を使用してそれを書くこともできます:
UPDATE "my_table" SET "a" = 5;
識別子を引用すると大文字と小文字が区別されますが、引用符で囲まれていない名前は常に小文字に変換されます(引用符で囲まれていない名前が大文字に変換されるSQL標準とは異なります)。例えば、識別子はFOO
、foo
、および"foo"
PostgreSQLで同一と見なされるが、"Foo"
及び"FOO"
これら三つの互いに異なります。
ポータブルアプリケーションを作成する場合は、常に特定の名前を引用するか、絶対に引用しないことをお勧めします。
大文字と小文字が混在する列名は、PostgresQLで二重引用符で囲む必要があります。そのため、最善の慣例は、すべての小文字にアンダースコアを付けることです。