【问题标题】:Postgres @sqlupdate casting data typePostgres @sqlupdate 转换数据类型
【发布时间】:2016-05-19 16:48:15
【问题描述】:

我有一个快速的问题想寻求帮助。

在我的 Postgres 表“user_profile”中,我将以下“video_uploaded”列定义为

    id                     | character(19)
    videos_uploaded        | character(19)[]             | 

存储视频 ID(固定长度,19 个字符)。

当我在 DAO 接口中使用array_append 函数编写@SqlUpdate 时,如下所示

    @SqlUpdate("UPDATE user_profile set videos_uploaded = array_append(videos_uploaded, :vid) where id = :id")

    void appendVideoToUpload(@Bind("id") String id, @Bind("vid") String vid);

程序总是抛出以下异常

错误:函数array_append(字符[],字符变化)不存在 !提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换

似乎要求添加显式类型转换,然后我添加像

这样的转换
array_append(videos_uploaded::varchar[], :vid::varchar)

但仍然会发生类似的异常。任何熟悉该问题的人都可以提供一些快速帮助吗?谢谢!

罗伊

【问题讨论】:

    标签: postgresql casting dao


    【解决方案1】:

    Char 和 varchar 是不同的数据类型,因此采用 anyarray, anyelement 的函数将失败。两个参数必须是相同的类型,所以你可以试试

    = array_append(videos_uploaded::varchar[], :vid)::char(19)[]
    

    = array_append(videos_uploaded, (:vid)::char(19))
    

    如果您的软件在参数和双冒号转换方面存在问题(这可能是因为参数是基于冒号而不是基于问号 (?) 的,请改用 CAST:

    = CAST(array_append(CAST(videos_uploaded AS varchar[]), :vid) AS char(19)[])
    

    = array_append(videos_uploaded, CAST(:vid AS char(19)))
    

    【讨论】:

    • 感谢您的回复。两种方案都试过了,还是失败了。错误消息显示“没有命名参数与“char”匹配,并且没有设置位置 1 的位置参数。困难的部分似乎是将 array_append(...) 中的 vid 解析为 char(19) 元素。
    • 这是您的软件在使用双冒号 (value::type) 进行 PostgreSQL 风格转换时遇到的错误。请改用CAST(value AS type),它会起作用。
    • @R.Zheng 我已经用 CAST 的例子更新了回复
    • 嗨 Ziggy,这太棒了!我刚刚尝试了显式 CAST 并且它有效!非常感谢,非常感谢。
    猜你喜欢
    • 2012-11-20
    • 2016-07-19
    • 2018-05-14
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多