Postgresql

PostgreSQL 替代 SQL Server 的 try_cast 函式

  • September 10, 2021

Microsoft SQL Server 有一個我認為非常明智的函式,如果強制轉換不成功,try_cast()它會返回 a null,而不是引發錯誤。

這使得可以使用CASE表達式或 acoalesce來回退。例如:

SELECT coalesce(try_cast(data as int),0);

問題是,PostgreSQL 有類似的東西嗎?

提出這個問題是為了填補我的知識空白,但也有一般原則,即有些人更喜歡對某些使用者錯誤做出不那麼戲劇性的反應。null在 SQL 中返回 a比返回錯誤更容易。例如SELECT * FROM data WHERE try_cast(value) IS NOT NULL;. 根據我的經驗,如果有 B 計劃,有時會更好地處理使用者錯誤。

如果從一種特定類型轉換為另一種特定類型就足夠了,您可以使用 PL/pgSQL 函式執行此操作:

create function try_cast_int(p_in text, p_default int default null)
  returns int
as
$$
begin
 begin
   return $1::int;
 exception 
   when others then
      return p_default;
 end;
end;
$$
language plpgsql;

然後

select try_cast_int('42'), try_cast_int('foo', -1), try_cast_int('bar')

退貨

try_cast_int | try_cast_int | try_cast_int
-------------+--------------+-------------
         42 |           -1 |             

如果這僅適用於數字,另一種方法是使用正則表達式來檢查輸入字元串是否為有效數字。當您期望許多不正確的值時,這可能比擷取異常更快。

引用自:https://dba.stackexchange.com/questions/203934