Saya mendapatkan ini secara tidak sengaja:
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)
Kueri kedua mengembalikan tupel yang berisi seluruh baris. Menggunakan postgres 9.0.1.
Edit: definisi situs berdasarkan permintaan. Saya tidak terlalu peduli, kekhasan ini cocok untuk semua meja
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
untuk mulai dengan. Mengapa Anda meminta kolom yang tidak ada?select site from site
- ini akan membantu Anda memahami jawaban Gayus lebih terinciJawaban:
NAME
sebenarnya adalah suatu fungsi . Ini adalah kekhasan dari Postgres bahwa fungsi dengan satu argumen misalnyafunction(arg)
dapat juga disebut sebagaiarg.function
. Dari dokumen:NAME
adalah tipe internal untuk nama objek , dan fungsi ini melemparkan argumennya ke tipe itu dan mengembalikannya.sumber
row
tipe sedang digunakantext
karena itu adalah tipe input dari fungsiname
. Thename
fungsi kemudian mengkonversi (tidak pengecoran) string masukan untuk jenisname
(yang juga akan memiliki efek samping truncating ke 64 bytes)Perhatikan juga bahwa pemeran implisit untuk nama dihapus di PostgreSQL 8.3, yang berarti perilaku ini tidak lagi berfungsi. Hampir mustahil untuk secara tidak sengaja mendapatkan perilaku ini di PostgreSQL 8.3 dan lebih tinggi karena tupel tidak secara otomatis dikonversi ke teks.
Jadi dalam 9.1:
tetapi untuk mendapatkan perilaku itu kita harus:
Atau kita bisa mendefinisikan fungsi nama kita sendiri dengan mengetikkan comp_table_test dan mengembalikan apa pun yang kita inginkan.
sumber
"nama" adalah kata kunci yang dilindungi undang-undang . Jadi Anda harus "mengutip" kata kunci untuk menggunakannya:
Ini telah menyelesaikan beberapa masalah ini bagi saya di masa lalu, meskipun kode yang Anda posting juga harus berfungsi tanpa mengutip. Di samping itu
kata karena Anda secara eksplisit menggunakan skema untuk menyelesaikan nama kolom
sumber
select site.name from site
mungkin secara implisit ditransformasikan keselect name(site::text) from site
mana sihir itu berasal.