Ich habe das zufällig bekommen:
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)
Die zweite Abfrage gibt ein Tupel zurück, das eine ganze Zeile enthält. Verwenden von Postgres 9.0.1.
Bearbeiten: Die Definition der Site auf Anfrage. Ich bin nicht wirklich wichtig, diese Eigenart funktioniert für jeden Tisch.
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
. Warum würden Sie nach einer Spalte fragen, die nicht existiert?select site from site
- dies wird Ihnen helfen, Gaius 'Antwort genauer zu verstehenAntworten:
NAME
ist eigentlich eine Funktion . Es ist eine Eigenart von Postgres, dass eine Funktion mit einem Argument, z. B.function(arg)
auch als bezeichnet werden kannarg.function
. Aus den Dokumenten:NAME
ist ein interner Typ für Objektnamen , und diese Funktion wandelt ihr Argument in diesen Typ um und gibt ihn zurück.quelle
row
Typ umgewandelt,text
da dies der Eingabetyp der Funktion istname
. Diename
Funktion konvertiert dann (ohne Casting) die Eingabezeichenfolge in Typname
(was auch den Nebeneffekt hat, auf 64 BytesBeachten Sie auch, dass die implizite Umwandlung in den Namen in PostgreSQL 8.3 entfernt wurde, was bedeutet, dass dieses Verhalten nicht mehr funktioniert. Es ist praktisch unmöglich, dieses Verhalten in PostgreSQL 8.3 und höher versehentlich zu erhalten, da Tupel nicht automatisch in Text konvertiert werden.
Also in 9.1:
aber um dieses Verhalten zu bekommen, müssen wir:
Oder wir definieren unsere eigene Namensfunktion, indem wir den Typ comp_table_test verwenden und alles zurückgeben, was wir möchten.
quelle
"Name" ist ein reserviertes Schlüsselwort . Sie sollten also das Schlüsselwort "zitieren", um es zu verwenden:
Dies hat einige dieser Probleme in der Vergangenheit für mich gelöst, obwohl der von Ihnen veröffentlichte Code auch ohne Anführungszeichen funktionieren sollte. Auf der anderen Seite
Wort, weil Sie das Schema explizit verwenden, um den Namen der Spalte aufzulösen
quelle
select site.name from site
könnte implizit transformiert werden,select name(site::text) from site
woher die Magie kommt.