在PL/pgSQL中,我有一个可能包含也可能不包含oid的列。我要查出是不是。
目前我是这样做的:

  select oidtext from t into x where name = fname;
  if found then
    begin
        select x::oid into looid;
    exception
        when SQLSTATE '22P02' then -- invalid oid
           null;

但这感觉有点老套。是否有阳性测试,即“此文本列是有效的x类型”或“这是有效的转换”?

最佳答案

似乎唯一的方法是捕获异常,但您可以在这样一个方便的函数中执行此操作:

create or replace function oid_or_null(text)
returns oid language plpgsql immutable as $$
begin
    return $1::oid;
exception when invalid_text_representation then
    return null;
end $$;

select oid_or_null('123'), oid_or_null('abc');

 oid_or_null | oid_or_null
-------------+-------------
         123 |
(1 row)

可以创建更通用的布尔函数:
create or replace function is_valid_cast(text, text)
returns boolean language plpgsql immutable as $$
begin
    execute format('select %L::%I', $1, $2);
    return true;
exception when others then
    return false;
end $$;

select
    is_valid_cast('123', 'oid') as oid, is_valid_cast('abc', 'oid') as not_oid,
    is_valid_cast('2018-10-10', 'date') as date, is_valid_cast('2018-20-20', 'date') as not_date;

 oid | not_oid | date | not_date
-----+---------+------+----------
 t   | f       | t    | f
(1 row)

关于postgresql - 如何测试给定的文本列是否为有效的oid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53622835/

10-10 03:40