2017-09-05 11 views
5

私はpostgres.org電子メールで式を見つけました。これは役に立つと思われますが、私が見つけられなかったドキュメントです。ここpostgresはどこにsql 'タプル'イディオムをキャストしたのですか?

select t.*::text from t 

は、::textキャストは、各列に適用すると思われる、とpsqlで表示される結果の出力は、ビット奇数です。おそらく、誰かが私のような人を教育し、その謎を解明することができたでしょう。

編集:最後に:不思議なことに、セクション4.2.9. Type Castsはこの構文への参照

編集を行うものではありません!関連ドキュメントは4.2.13. Row Constructorsにあります。

答えて

4

私は何が起こっているか説明できます。

select (1, 2) 

これは、2つの列を持つレコード(またはタプル)を返します。あなたはcast()または::のいずれかを使用してテキストにタプルを変換することができます:

select (1, 2)::text 

同じことがt.*で発生します。ただ、直接テーブルtの名前(またはエイリアス)を使用

select cast(t.* as text) 
+0

感謝。興味深いことに、sqlでは '(a、b.c)という表現をタプルできます。' Postgresは実際にこのトピックに関する素晴らしい文書を持っています: 8.16.5。クエリでの複合型の使用 – artejera

2

SELECT t::text FROM t 

t.*あなたがして同じ結果を得るでしょう

select (t.*)::text 

:次のように解釈されます行を分解するために使用されますが、行全体をテキストにキャストするので、ステップは冗長なノイズです。

Postgresですべてをtextにキャストできるので、castが可能です。 (入力/出力のテキスト表現が必要です。)

行のテキスト表現はどちらの方法でも得られます。私。

SELECT '(123,"some text",,"2017-01-03 02:27:27.930164+01")'::t 

tは、テーブルの名前である、または現在のsearch_pathに見えるビューを((マテリア)、またはあなたが持っている:出力は、あなたが同じように、登録された行の型にキャストバックすることができた、有効な文字列リテラルでありますschema-qualify)またはその他の登録済み(行)型のいずれかです。

これは、Postgresが作成するすべてのテーブルに対して行タイプを登録するため、デフォルトのままのテーブル名で動作します。

匿名レコード(ROW(1,2)、またはちょうど(1,2)など)の場合は、t.*の表記もキャストバックもできません。システムカタログには、その構造に関する情報はありません。

関連:あなたの非常に明確な応答のための

関連する問題