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 o postgres 9.0.1.
Edit: a definição de site por solicitação. Realmente não importa, essa peculiaridade funciona para qualquer tabela.
db=> \d site
Table "public.site"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('site_id_seq'::regclass)
title | text | not null
postgresql
database-design
postgresql-9.0
hegemon
fonte
fonte
site
.site
para começar. Por que você consultaria uma coluna que não existe?select site from site
- o que irá ajudar você a entender a resposta de Caio em mais detalhesRespostas:
NAME
é realmente uma função . É uma peculiaridade do Postgres que uma função com um argumento, por exemplo,function(arg)
também possa ser chamada comoarg.function
. Dos documentos:NAME
é um tipo interno para nomes de objetos e essa função está lançando seu argumento para esse tipo e retornando-o.fonte
row
tipo está sendo convertido,text
porque esse é o tipo de entrada da funçãoname
. Aname
função é, em seguida, converter (não seleção de elenco) a cadeia de entrada com o tiponame
(que também vai ter o efeito colateral de truncar a 64 bytes)Observe também que a conversão implícita para o 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, na 9.1:
mas para obter esse comportamento, precisamos:
Ou podemos definir nossa própria função de nome, digitando comp_table_test e retornando o que gostaríamos.
fonte
"nome" é uma palavra-chave reservada . Portanto, você deve "citar" a palavra-chave para usá-la:
Isso resolveu alguns desses problemas para mim no passado, apesar do código que você postou também deve funcionar sem citar. Por outro lado
palavra porque você está usando explicitamente o esquema para resolver o nome da coluna
fonte
select site.name from site
pode ser implicitamente transformado para oselect name(site::text) from site
qual é de onde vem a mágica.