Obtuve esto por accidente:
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 segunda consulta devuelve una tupla que contiene una fila completa. Usando postgres 9.0.1.
Editar: la definición de sitio por solicitud. Realmente no importa, esta peculiaridad funciona para cualquier mesa.
db=> \d site
Table "public.site"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('site_id_seq'::regclass)
title | text | not null

site.siteprimer lugar. ¿Por qué preguntarías por una columna que no existe?select site from site: esto te ayudará a comprender la respuesta de Gaius con más detalleRespuestas:
NAMEEn realidad es una función . Es una peculiaridad de Postgres que una función con un argumento, por ejemplofunction(arg), también se puede llamar comoarg.function. De los documentos:NAMEes un tipo interno para nombres de objetos , y esta función está lanzando su argumento a ese tipo y devolviéndolo.fuente
rowse está convirtiendo el tipotextporque ese es el tipo de entrada de la funciónname. Lanamefunción está convirtiendo después (no casting) la cadena de entrada con el tiponame(que también tendrá el efecto secundario de truncar a 64 bytes)También tenga en cuenta que la conversión implícita a nombre se eliminó en PostgreSQL 8.3, lo que significa que este comportamiento ya no funciona. Es prácticamente imposible obtener accidentalmente este comportamiento en PostgreSQL 8.3 y versiones posteriores porque las tuplas no se convierten automáticamente en texto.
Entonces en 9.1:
pero para obtener ese comportamiento tenemos que:
O podríamos definir nuestra propia función de nombre tomando el tipo comp_table_test y devolviendo lo que queramos.
fuente
"nombre" es una palabra clave reservada . Por lo tanto, debe "citar" la palabra clave para usarla:
Esto ha resuelto algunos de estos problemas en el pasado, aunque el código que publicaste también debería funcionar sin citar. Por otra parte
palabra porque está utilizando explícitamente el esquema para resolver el nombre de la columna
fuente
select site.name from sitepodría transformarse implícitamente deselect name(site::text) from sitedónde proviene la magia.