фантомная колонка "имя"? - PullRequest
2 голосов
/ 18 апреля 2011

начинаю просто:

hoops=# select * from core_school limit 3;
 id |   school_name    | nickname 
----+------------------+----------
  1 | Marshall         | 
  2 | Ohio             | 
  3 | Houston          | 
(10 rows)

Давайте введем преднамеренную ошибку:

hoops=# select name from core_school;
ERROR:  column "name" does not exist
LINE 1: select name from core_school;

Но почему это работает? (с неожиданным результатом!):

hoops=# select core_school.name from core_school limit 3;
  name       
-----------------
(1,Marshall,"")
(2,Ohio,"")
(3,Houston,"")
(3 rows)

Откуда появился столбец "name" в третьем запросе?

Ответы [ 2 ]

8 голосов
/ 18 апреля 2011

Это функция автоматического вещания PostgreSQL, которая позволяет вызывать function(argument) как argument.function.

То, что вы действительно называете

SELECT  NAME(core_school)
FROM    core_school

Сравните с этим:

SELECT  (1::int).exp
--
2.71828182845905

что само собой разумеется.

Эта «особенность» очень часто приводит к путанице и будет (окончательно) удалена в 9.1.

0 голосов
/ 18 апреля 2011

Возможно, у вас другая версия Postgres, чем у меня. (У меня есть 8.3.7.) Но у меня нет такого "фантомного" столбца имени.

Если вы просто скажете «выбрать core_school from core_school», вы получите одну строку вывода для каждой строки таблицы, причем эта строка состоит из массива значений всех столбцов таблицы. Вот что ты видишь.

О, я заметил, что вы получаете название колонки дилера. Возможно, вы на самом деле не ставили точку между «core_school» и «name», а пробел, и теперь «name» является псевдонимом для имени столбца. (Для установки моего Postgres требуется слово «as», чтобы создать псевдоним для имени столбца, но в некоторых базах данных это не требуется, поэтому, возможно, в Postgres есть возможность для совместимости.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...