postgres sql'cast a tuple'成语在哪里记录?

时间:2017-09-05 01:25:55

标签: sql postgresql

我在postgres.org电子邮件中找到了一个表达式,这似乎很有用,但是我找不到它的文档。

select t.*::text from t

这里,::text强制转换似乎适用于每个列,而psql显示的结果输出有点奇怪。也许有人可以教育像我这样的人,解开那个谜。

编辑:奇怪的是,4.2.9. Type Casts部分没有提及此语法

编辑:最后!相关文档位于4.2.13. Row Constructors

2 个答案:

答案 0 :(得分:4)

我可以描述发生了什么。请考虑以下语法:

<ul>   
    @foreach($main_nav as $mainMenu)    
        <li>
            <a href="{{  $mainMenu->page_type == "link-page" ? "$mainMenu->link" : route('home').'/'.$mainMenu->link }}">
                {{ $mainMenu->title  }}
            </a> 
        </li>   
     @endforeach 
</ul>

这将返回包含两列的记录(或元组)。您可以使用select (1, 2) cast()

将元组转换为文本
::

select (1, 2)::text 也是如此。它被解释为:

t.*

您将获得相同的结果:

select (t.*)::text

答案 1 :(得分:2)

直接使用表t的名称(或别名):

SELECT t::text FROM t

t.*将用于分解行,但由于您将整行转换为文本,因此该步骤是冗余噪声。

cast是可能的,因为Postgres中的所有内容都可以转换为text。 (必须有输入/输出的文本表示。)

您可以获得该行的文本表示。即输出是有效的字符串文字,您可以将其强制转换为已注册的行类型,如:

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

t是表格或(物化)视图的名称(在当前search_path中可见,或者您必须符合架构资格)或任何其他已注册(行)类型。

这适用于开箱即用的表名,因为Postgres会为您创建的每个表注册一个行类型。

注意,对于匿名记录(例如t.*或仅ROW(1,2)),(1,2)符号和强制转换都不可能。系统目录中没有关于其结构的信息。

相关: