sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLエラー:関数to_tsvector(文字が変化します、不明)が存在しません

    明示的な型キャストを使用する:

    SELECT language, to_tsvector(language::regconfig, 'hello world') FROM languages;

    または、列languages.languageを変更します regconfigと入力します 。 @Swavの回答を参照してください。

    なぜですか?

    Postgresは関数のオーバーロードを許可します。関数のシグネチャは、(オプションでスキーマ)によって定義されます。 -修飾)名前 プラス(のリスト)入力パラメータタイプ (s)。 to_tsvector()の2パラメータ形式 タイプregconfigが必要です 最初のパラメータとして:

    SELECT proname, pg_get_function_arguments(oid)
    FROM   pg_catalog.pg_proc
    WHERE  proname = 'to_tsvector'
    
       proname   | pg_get_function_arguments
    -------------+---------------------------
     to_tsvector | text
     to_tsvector | regconfig, text             -- you are here
    

    完全に一致する既存の関数がない場合 、関数型解決のルールが最適な一致を決定します-もしあれば。これはto_tsvector('english', 'hello world')で成功します 、'english' 型なし文字列リテラルであること 。ただし、入力されたvarcharパラメータで失敗します 、登録された暗黙的がないため varcharからキャスト regconfigへ 。マニュアル:

    入力タイプが一致せず、変換できない候補関数を破棄します(暗黙的を使用) 変換)一致する。 不明な文字 この目的のために何にでも変換可能であると想定されています。

    大胆な強調鉱山。
    regconfigの登録キャスト :

    SELECT castsource::regtype, casttarget::regtype, castcontext
    FROM   pg_catalog.pg_cast
    WHERE  casttarget = 'regconfig'::regtype;
    
     castsource | casttarget | castcontext
    ------------+------------+-------------
     oid        | regconfig  | i
     bigint     | regconfig  | i
     smallint   | regconfig  | i
     integer    | regconfig  | i
    

    castcontextの説明 :

    castcontext char
    キャストを呼び出すことができるコンテキストを示します。 e 明示的なキャストとしてのみ意味します(CASTを使用) または:: 構文)。 a 明示的にだけでなく、ターゲット列に暗黙的に割り当てられることを意味します。 i は、式やその他の場合に暗黙的に意味します。

    3つの異なるタイプの割り当てについてもっと読む CREATECASTの章で。



    1. Javaでpl/sql関数を呼び出しますか?

    2. Oracleでテーブルの列を並べ替える

    3. 各行の列値に基づいて行を複製する

    4. SQL Server 2008ManagementStudioがクエリの構文をチェックしていません