Je l'ai eu par accident:
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)
La deuxième requête renvoie un tuple contenant une ligne entière. Utilisation de postgres 9.0.1.
Edit: la définition du site sur demande. Je n'ai pas vraiment d'importance, cette bizarrerie fonctionne pour n'importe quelle table.
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
pour commencer. Pourquoi voudriez-vous rechercher une colonne qui n'existe pas?select site from site
- cela vous aidera à comprendre la réponse de Gaius plus en détailRéponses:
NAME
est en fait une fonction . C'est une bizarrerie de Postgres qu'une fonction avec un seul argument, par exemple,function(arg)
peut également être appelée asarg.function
. De la documentation:NAME
est un type interne pour les noms d'objets , et cette fonction convertit son argument en ce type et le renvoie.la source
row
type est converti entext
car il s'agit du type d'entrée de la fonctionname
. Laname
fonction convertit alors (pas la conversion) la chaîne d'entrée en typename
(ce qui aura également pour effet secondaire de tronquer à 64 octets)Notez également que la conversion implicite en nom a été supprimée dans PostgreSQL 8.3, ce qui signifie que ce comportement ne fonctionne plus. Il est pratiquement impossible d'obtenir accidentellement ce comportement dans PostgreSQL 8.3 et versions ultérieures car les tuples ne se convertissent pas automatiquement en texte.
Donc en 9.1:
mais pour obtenir ce comportement, nous devons:
Ou nous pourrions définir notre propre fonction de nom en prenant le type comp_table_test et en retournant ce que nous voudrions.
la source
"nom" est un mot clé réservé . Vous devez donc "citer" le mot-clé pour l'utiliser:
Cela a résolu certains de ces problèmes pour moi dans le passé, même si le code que vous avez publié devrait également fonctionner sans devis. D'autre part
mot parce que vous utilisez explicitement le schéma pour résoudre le nom de la colonne
la source
select site.name from site
pourrait être implicitement transformé àselect name(site::text) from site
qui vient la magie.