28

CAST操作が失敗した場合に返されるデフォルト値を定義することは可能ですか?

たとえば、次のようになります。

SELECT CAST('foo' AS INTEGER)

エラーをスローする代わりにデフォルト値を返しますか?

4

2 に答える 2

39

CASTのデフォルト値はありません:

型キャストは、あるデータ型から別のデータ型への変換を指定します。PostgreSQL は、型キャストに対して 2 つの同等の構文を受け入れます。

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)次に、 getのようなことを言うことができます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

有効な整数ではない値を取得0します。some_text_columnこの自動デフォルト キャストを使用して s をキャストする場合varcharは、ダブル キャストする必要があります。

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

これができるからといって、それが良い考えであるとは限りません。標準テキストを整数キャストに置き換えることは、これまでで最高のアイデアだとは思いません。上記のアプローチでは、標準varcharinteger単独でキャストする必要もあります。組み込みのキャストに怠惰にパントするのではなく、変換全体を自分で行いたい場合は、それを回避できます。

NULL の処理は、読者の (簡単な) 演習として残されています。

于 2012-04-24T23:32:38.067 に答える
3

ドキュメントの説明に従ってエラーをトラップし、代わりに実行するアクションを指定します。

以下に含まれるPostgreSQL スニペットのエラー トラップに関するドキュメント。

35.7.5. エラーのトラップ

デフォルトでは、PL/pgSQL 関数でエラーが発生すると、関数の実行が中止され、実際には周囲のトランザクションも中止されます。EXCEPTION 句を指定した BEGIN ブロックを使用すると、エラーをトラップして回復できます。この構文は、BEGIN ブロックの通常の構文を拡張したものです。

[ <<label>> ]
[ DECLARE
    declarations ]
BEGIN
    statements
EXCEPTION
    WHEN condition [ OR condition ... ] THEN
        handler_statements
    [ WHEN condition [ OR condition ... ] THEN
          handler_statements
      ... ]
END;

エラーが発生しない場合、この形式のブロックは単純にすべてのステートメントを実行し、制御は END の後の次のステートメントに渡されます。ただし、ステートメント内でエラーが発生した場合、ステートメントの以降の処理は中止され、制御は EXCEPTION リストに渡されます。リストから、発生したエラーに一致する最初の条件が検索されます。一致が見つかった場合、対応する handler_statements が実行され、END の後の次のステートメントに制御が渡されます。一致するものが見つからない場合、EXCEPTION 句がまったく存在しないかのようにエラーが伝播します。エラーは、EXCEPTION で囲んでいるブロックによってキャッチできます。または、何もない場合は、関数の処理を中止します。

于 2012-04-24T22:53:35.523 に答える