Eu peguei isso por acidente:
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)
A segunda consulta retorna uma tupla contendo uma linha inteira. Usando postgres 9.0.1.
Editar: a definição de site por solicitação. Eu realmente não importa, essa peculiaridade funciona para qualquer mesa.
db=> \d site
Table "public.site"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('site_id_seq'::regclass)
title | text | not null
NAME
na verdade é uma função . É uma peculiaridade do Postgres que uma função com um argumento, por exemplofunction(arg)
, também pode ser chamada comoarg.function
. Dos documentos:NAME
é um tipo interno para nomes de objetos e esta função está lançando seu argumento para esse tipo e retornando-o.Observe também que a conversão implícita para nome foi removida no PostgreSQL 8.3, o que significa que esse comportamento não funciona mais. É praticamente impossível obter esse comportamento acidentalmente no PostgreSQL 8.3 e superior porque as tuplas não são convertidas automaticamente em texto.
Então em 9.1:
mas para obter esse comportamento, temos que:
Ou podemos definir nossa própria função de nome pegando o tipo comp_table_test e retornando o que quisermos.
"nome" é uma palavra-chave reservada . Portanto, você deve "citar" a palavra-chave para usá-la:
Isso resolveu alguns desses problemas para mim no passado, embora o código que você postou também funcione sem aspas. Por outro lado
palavra porque você está explicitamente usando o esquema para resolver o nome da coluna