Чи залежать регістри імен стовпців PostgreSQL?


157

У мене є таблиці БД сказати, personsв Postgres передавалася іншою командою , яка має ім'я стовпця сказати, "first_Name". Зараз я намагаюся використовувати командира PG для запиту цієї таблиці у цій імені стовпця.

select * from persons where first_Name="xyz";

І це просто повертається

ПОМИЛКА: стовпець "first_Name" не існує

Не впевнений, чи я роблю щось дурне, чи є вирішення цієї проблеми, яку я пропускаю?

Відповіді:


284

Всі ідентифікатори (включаючи назви стовпців), які не є подвійним цитуванням, складаються в нижній регістр PostgreSQL. Імена стовпців, які були створені подвійними лапками і, таким чином, зберегли великі літери (та / або інші порушення синтаксису), повинні бути подвійними цитатами протягом усього життя: ( "first_Name")

Отже, так , назви стовпців PostgreSQL залежать від регістру:

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

Також виправте неправильні подвійні лапки навколо 'xyz'. Значення (рядкові літерали) укладаються в єдині лапки .

Прочитайте посібник тут.

Моя постійна порада - використовувати легальні, малі імена виключно, щоб подвійне цитування не потрібно.


4
@ArtB: Стандарт SQL визначає ідентифікатори нечутливих до регістру так, як це реалізує Postgres. Єдине відхилення: без котируючих ідентифікаторів складені у верхній регістр у стандарті, але у нижньому регістрі pg все, що не котирується подвійно. (Доречно лише в рідкісних кутових випадках.) Докладні відомості в посібнику тут.
Ервін Брандстеттер

1
@adfs: Я не думаю, що можу пояснити це краще, ніж я вже робив. Детальніше перейдіть за посиланням на посібник, який я надав неодноразово.
Ервін Брандстеттер

15
@adfs: У SQL foobar, FOOBARі FooBarтой самий ідентифікатор. Тим НЕ менше "foobar", "FooBar"і "FOOBAR"різні ідентифікатори
a_horse_with_no_name

5
@a_horse_with_no_name так, але під SQL foobarі FOOBARте саме "FOOBAR", що і під potgresql FOOBARта foobarін "foobar".
Ясен

1
@KamelMili: Я пропоную ваше питання поставити як питання , надавши всю необхідну інформацію. Коментарі - це не місце. Ви завжди можете посилатися на цю відповідь для контексту. І ви можете залишити коментар із посиланням на ваше пов’язане питання тут (щоб також привернути мою увагу).
Ервін Брандстеттер

16

Для цитування документації :

Ключові слова та котируються ідентифікатори не залежать від регістру. Тому:

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"відрізняються від цих трьох і один з одним.

Якщо ви хочете написати портативні програми, вам рекомендується завжди цитувати певне ім’я або ніколи його не цитувати.


8

Імена стовпців, що є змішаним регістром або великими літерами, повинні бути подвійними цитатами в PostgresQL. Тож найкращою умовою буде дотримання всіх невеликих випадків із підкресленням.


2
Це неправильно згідно пояснення, яке дав @ erwin-marketetter
Майкл Сілвер

9
Як це неправильно? Якщо у вас є імена стовпців, які є змішаним регістром або великими літерами, для того, щоб посилатися на них, вам потрібно поставити ідентифікатор у подвійних лапки.
theferrit32
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.