魔法のコラム「名前」はどこから来たのですか?


11

私は偶然これを手に入れました:

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)

2番目のクエリは、行全体を含むタプルを返します。postgres 9.0.1を使用します。

編集:リクエストによるサイトの定義。私は本当に問題ではありません、この癖はどのテーブルでも機能します。

db=> \d site
                         Table "public.site"
 Column |  Type   |                     Modifiers
--------+---------+---------------------------------------------------
 id     | integer | not null default nextval('site_id_seq'::regclass)
 title  | text    | not null

の定義を示すのに役立ちますsite
Peter Eisentraut 2011

〜それはない今、私たちはには「名前」が存在しないことを見ることができるので問題siteから始めることを。存在しない列を照会するのはなぜですか?
jcolebrand

1
試してみてくださいselect site from site-これはあなたがより詳細にガイウスの答えを理解するのに役立ちます
ジャック氏は述べていtopanswers.xyz試して

回答:


11

NAME実際には関数です。Postgresの奇妙な点として、引数が1つfunction(arg)しかない関数をとして呼び出すこともできますarg.function。ドキュメントから:

関数表記と属性表記の同等性により、複合型の関数を使用して「計算フィールド」をエミュレートできます。

NAMEオブジェクト名の内部型であり、この関数は引数をその型にキャストして返します。


ありがとう、知らなかった。この特定の関数の「名前」がどこかに文書化されている場合、何が気になりますか?
hegemon

私の回答を更新
ガイウス

2
より正確には、row型がキャストされtextているのは、それが関数の入力型だからですname。次に、name関数は入力文字列を型に変換(キャストではない)しますname(64バイトに切り捨てるという副作用もあります)
ジャックはtry topanswers.xyzを試した

3

名前への暗黙のキャストはPostgreSQL 8.3で削除されたことにも注意してください。つまり、この動作は機能しなくなります。タプルは自動的にテキストに変換されないため、PostgreSQL 8.3以降で誤ってこの動作をすることは事実上不可能です。

したがって、9.1では:

or_examples=# select c.name from comp_table_test c;
ERROR:  column c.name does not exist
LINE 1: select c.name from comp_table_test c;

しかし、その動作を取得するには、次のことを行う必要があります。

or_examples=# select name(c::text) from comp_table_test c;

または、タイプcomp_table_testを取り込んで、必要なものを返す独自の名前関数を定義することもできます。


この答えがわかりません。上記の質問は8.3以降では問題にならないはずですか?それでも質問は9.0について尋ねます
コリン・ハート

0

「名前」は予約済みのキーワードです。したがって、キーワードを「引用」して使用する必要があります。

SELECT "name" FROM site;

これにより、過去にこれらの問題のいくつかが解決されましたが、投稿したコードも引用せずに機能するはずです。一方

select site.name from site;

スキーマを明示的に使用して列の名前を解決しているため


1
多くの予約語を使用できますが、この場合は引用しても役に立ちません。これは、site.nameが列として存在しない場合、8.3より前では、サイトデータ型またはサイトから暗黙的にキャストされた型を受け取る名前関数を探し始めるためです。サイトは暗黙的にテキストにキャストできるため、name(text)が使用されます。その結果、魔法がどこから来るのselect site.name from siteかに暗黙的に変換される可能性がありますselect name(site::text) from site
Chris Travers 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.