Dostałem to przez przypadek:
db=> select name from site;
ERROR: column "name" does not exist
LINE 1: select name from site;
^
db=> select site.name from site;
name
---------------
(1,mysitename)
(1 row)
Drugie zapytanie zwraca krotkę zawierającą cały wiersz. Korzystanie z Postgres 9.0.1.
Edycja: definicja strony na żądanie. Nie mam większego znaczenia, to dziwactwo działa na każdym stole.
db=> \d site
Table "public.site"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('site_id_seq'::regclass)
title | text | not null
site
.site
. Dlaczego pytasz o kolumnę, która nie istnieje?select site from site
- pomoże ci to zrozumieć bardziej szczegółowo odpowiedź GajuszaOdpowiedzi:
NAME
jest właściwie funkcją . Dziwne jest to, że Postgresfunction(arg)
może wywoływać funkcję z jednym argumentem np . Jakoarg.function
. Z dokumentów:NAME
jest wewnętrznym typem nazw obiektów , a ta funkcja przekazuje swój argument do tego typu i zwraca go.źródło
row
typ jest rzutowany,text
ponieważ jest to typ wejściowy funkcjiname
. Następniename
funkcja konwertuje (nie rzutuje) ciąg wejściowy na typname
(co będzie miało również efekt uboczny obcięcia do 64 bajtów)Zauważ również, że niejawna rzutowana na nazwę została usunięta w PostgreSQL 8.3, co oznacza, że to zachowanie nie działa. Jest praktycznie niemożliwe przypadkowe uzyskanie tego zachowania w PostgreSQL 8.3 i nowszych, ponieważ krotki nie są automatycznie konwertowane na tekst.
W 9.1:
ale aby uzyskać takie zachowanie, musimy:
Lub moglibyśmy zdefiniować naszą własną nazwę, przyjmując typ comp_table_test i zwracając cokolwiek byśmy chcieli.
źródło
„nazwa” jest zastrzeżonym słowem kluczowym . Dlatego powinieneś „zacytować” słowo kluczowe, aby go użyć:
W przeszłości rozwiązało to niektóre z tych problemów, chociaż kod, który opublikowałeś, powinien również działać bez cytowania. Z drugiej strony
słowo, ponieważ jawnie używasz schematu do rozwiązania nazwy kolumny
źródło
select site.name from site
z tym można w sposób dorozumiany przekształcić się wselect name(site::text) from site
to, skąd pochodzi magia.