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
.site
primer 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:
NAME
En 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:NAME
es un tipo interno para nombres de objetos , y esta función está lanzando su argumento a ese tipo y devolviéndolo.fuente
row
se está convirtiendo el tipotext
porque ese es el tipo de entrada de la funciónname
. Laname
funció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 site
podría transformarse implícitamente deselect name(site::text) from site
dónde proviene la magia.