Czy w nazwach kolumn PostgreSQL rozróżniana jest wielkość liter?


157

Mam do powiedzenia tabeli db, personsw PostgreSQL wydawane są przez inny zespół, który ma nazwę kolumna powiedzenia, "first_Name". Teraz próbuję użyć dowódcy PG, aby zapytać tę tabelę o tę nazwę kolumny.

select * from persons where first_Name="xyz";

I po prostu wraca

BŁĄD: kolumna „first_Name” nie istnieje

Nie masz pewności, czy robię coś głupiego, czy też istnieje obejście tego problemu, którego brakuje?

Odpowiedzi:


284

Wszystkie identyfikatory (w tym nazwy kolumn), które nie są umieszczane w cudzysłowach, są w PostgreSQL składane do małych liter. Nazwy kolumn, które zostały utworzone za pomocą podwójnych cudzysłowów, a tym samym zachowały wielkie litery (i / lub inne naruszenia składni), muszą być cytowane w cudzysłowie do końca życia: ( "first_Name")

Zatem tak , w nazwach kolumn PostgreSQL rozróżniana jest wielkość liter:

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

Popraw także błędne cudzysłowy wokół 'xyz'. Wartości (literały łańcuchowe) są ujęte w pojedyncze cudzysłowy .

Przeczytaj instrukcję tutaj.

Moja stała rada brzmi: używaj wyłącznie legalnych nazw z małych liter, więc podwójne cudzysłowy nie są potrzebne.


4
@ArtB: Standard SQL definiuje identyfikatory bez rozróżniania wielkości liter, tak jak implementuje go Postgres. Jedyne odchylenie: identyfikatory bez cudzysłowów są standardowo składane do wielkich liter, ale pg małe litery wszystko, co nie jest cudzysłowem. (Dotyczy tylko rzadkich przypadków narożnych.) Szczegóły w instrukcji tutaj.
Erwin Brandstetter

1
@adfs: Myślę, że nie potrafię tego lepiej wyjaśnić niż już to zrobiłem. Aby uzyskać więcej, skorzystaj z linku do instrukcji, którą wielokrotnie dostarczałem.
Erwin Brandstetter

15
@adfs: w języku SQL foobar, FOOBARi FooBarmają ten sam identyfikator. Jednakże "foobar", "FooBar"i "FOOBAR"są różne identyfikatory
a_horse_with_no_name

5
@a_horse_with_no_name tak, ale w SQL foobari FOOBARsą takie same jak "FOOBAR"w potgresql FOOBARi foobaretc są takie same jak "foobar".
Jasen,

1
@KamelMili: Proponuję zadać pytanie jako pytanie , podając wszystkie niezbędne informacje. Komentarze nie są miejscem. Zawsze możesz podać link do tej odpowiedzi w celu uzyskania kontekstu. Możesz zostawić tutaj komentarz z linkiem do powiązanego pytania (aby również zwrócić moją uwagę).
Erwin Brandstetter

16

Aby zacytować dokumentację :

W słowach kluczowych i identyfikatorach bez cudzysłowu nie jest rozróżniana wielkość liter. W związku z tym:

UPDATE MY_TABLE SET A = 5;

można równoważnie zapisać jako:

uPDaTE my_TabLE SeT a = 5;

Możesz również napisać to za pomocą cudzysłowów :

UPDATE "my_table" SET "a" = 5;

Cytowanie identyfikatora sprawia, że ​​rozróżniana jest wielkość liter, podczas gdy nazwy bez cudzysłowu są zawsze zawijane do małych liter (w przeciwieństwie do standardu SQL, w którym nazwy bez cudzysłowów są zawijane do wielkich liter). Na przykład, identyfikatory FOO, fooi "foo"są uważane za takie same przez PostgreSQL, ale "Foo"i "FOO"różnią się od tych trzech i siebie nawzajem.

Jeśli chcesz pisać aplikacje przenośne, radzimy zawsze cytować określoną nazwę lub nigdy jej nie cytować.


8

Nazwy kolumn, które są mieszane lub wielkie, muszą być w PostgresQL cudzysłowem. Dlatego najlepszą konwencją będzie śledzenie wszystkich małych spraw z podkreśleniem.


2
To jest niepoprawne, zgodnie z wyjaśnieniem podanym przez @ erwin-brandstetter
Michael Silver

9
Jak to się nie zgadza? Jeśli masz nazwy kolumn, które są mieszane lub duże, aby się do nich odwołać, musisz umieścić identyfikator w podwójnych cudzysłowach.
theferrit32
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.