当前位置: 首页 > 面试题库 >

Postgres:为CAST失败定义默认值吗?

卞轶
2023-03-14
问题内容

是否可以定义在CAST操作失败时将返回的默认值?

例如,这样:

SELECT CAST('foo' AS INTEGER)

将返回默认值而不是抛出错误吗?


问题答案:

CAST没有默认值:

类型转换指定从一种数据类型到另一种数据类型的转换。PostgreSQL接受两种等效的类型转换语法:

CAST ( expression AS type )
expression::type

除了要转换的表达式和所需的目标类型以外,语法中没有余地。

但是,您可以通过简单的功能手动完成此操作:

create or replace function cast_to_int(text, integer) returns integer as $$
begin
    return cast($1 as integer);
exception
    when invalid_text_representation then
        return $2;
end;
$$ language plpgsql immutable;

然后,您可以说出类似的话cast_to_int('pancakes', 0)并得到0

PostgreSQL还允许您创建自己的演员表,因此您可以执行以下操作:

create or replace function cast_to_int(text) returns integer as $$
begin
    -- Note the double casting to avoid infinite recursion.
    return cast($1::varchar as integer);
exception
    when invalid_text_representation then
        return 0;
end;
$$ language plpgsql immutable;

create cast (text as integer) with function cast_to_int(text);

那你可以说

select cast('pancakes'::text as integer)

得到0或者你可以说

select cast(some_text_column as integer) from t

并获取不是有效整数0some_text_column值。如果您想varchar使用此自动默认转换强制转换s,则必须进行双重转换:

select cast(some_varchar::text as integer) from t

仅仅因为您可以做到这一点,就不是一个好主意。我不认为将标准文本替换为整数强制转换是最好的主意。上面的方法还要求您保留标准varcharinteger单独进行转换,如果您想自己进行整个转换而不是懒洋洋地打入内置转换,则可以避免这种情况。

NULL处理是读者的一项(轻松)练习。



 类似资料:
  • 当我在JAX-RS中添加字符串的默认值时,它不接受该值。它保持为null或空。 当我将状态传递为空或或未定义时,它将保持为空或或未定义。它不会将默认值视为已确认。

  • 我被一个奇怪的编程问题困住了。我已经定义了一个模式,其中如果没有为列(列名是Title)传递值,那么将使用默认值(Harry)。 标题|字符变化(64)|默认“Harry”::字符变化 而且,我正在尝试通过我的java应用程序使用hibernate插入条目。 发生的情况是,hibernate在任何查询中都显式地为该列提供空值,因此这些条目的默认值不会显示在表中。 这里要提到的是,当我自己执行任何i

  • 我有Mysql 8.0.19作为docker实例。在我们之前的应用程序中,我们使用JDK的默认密钥库进行SSL。使用JDK的密钥库连接到Mysql服务器,无论使用SSL还是不使用SSL都可以。这里我们没有手动配置Mysql的SSL。我们使用Mysql的默认SSL机制。 现在出于某种原因,我们决定使用我们自己的密钥库,并使用以下变量覆盖JVM的密钥库 在此之后,与mysql for SSL的连接出现

  • 我正在做一个MEAN堆栈项目,用户可以添加帖子,编辑和删除它们。但是在执行所需的方法后,帖子没有被删除,我面临一个错误。我是新来的意思堆栈。 posts.service.ts 应用程序。js 帖子。组件。ts 帖子。组成部分html 发布模型。js(用于后端) 这是我每次尝试删除任何帖子时都会遇到的错误:- 错误: CastError: Cast to ObjectId在模型“Post”的路径“_

  • 问题内容: 如何在Doctrine 2中设置默认值? 问题答案: 数据库默认值不受“便携式”支持。使用数据库默认值的唯一方法是通过mapping属性,在该属性中为字段所映射的列指定代码段(包括原因在内)。 您可以使用: 最好使用PHP级别的默认值,因为这些值也可以在新创建和持久保存的对象上正确使用(持久保存新对象以获取默认值后,Doctrine不会返回数据库)。

  • CamelConsumer配置 我从日志中看到,当使用者启动时,有15个使用者线程(假设在1个节点上),这是很好的配置。 如果服务器不可用时由于网络问题或任何其他情况而停止响应。所有的kafka消费者都开始退订,这又是一个预期的行为(到目前为止还不错)