8

この psql セッション スニペットは一目瞭然です。

psql (9.1.7)
Type "help" for help.
=> CREATE TABLE languages(language VARCHAR NOT NULL);
CREATE TABLE
=> INSERT INTO languages VALUES ('english'),('french'),('turkish');
INSERT 0 3
=> SELECT language, to_tsvector('english', 'hello world') FROM languages;
 language|     to_tsvector     
---------+---------------------
 english | 'hello':1 'world':2
 french  | 'hello':1 'world':2
 turkish | 'hello':1 'world':2
(3 rows)

=> SELECT language, to_tsvector(language, 'hello world') FROM languages;
ERROR:  function to_tsvector(character varying, unknown) does not exist
LINE 1: select language, to_tsvector(language, 'hello world')...
                         ^
HINT:  No function matches the given name and argument types.  
You might need to add explicit type casts.

問題は、Postgres 関数がフィールド タイプto_tsvectorを好まないことですが、ドキュメントによるとvarchar、この呼び出しは完全に正しいはずですか?

4

2 に答える 2

12

明示的な型キャストを使用します。

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

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

なんで?

Postgres では、関数のオーバーロードが可能です。関数シグネチャは、(オプションでschema修飾された)名前と (のリスト)入力パラメーターの型によって定義されます。の 2 パラメーター形式は、最初のパラメーターとしてto_tsvector()型を期待します。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

正確に一致する既存の関数がない場合、 Function Type Resolutionの規則により、最適な一致があればそれが決定されます。これは、型指定されていない文字列リテラルであるためto_tsvector('english', 'hello world')、成功し ます。しかし、 からへの暗黙的なキャストが登録されていないため、 と入力されたパラメーターでは失敗します。マニュアル:'english'varcharvarcharregconfig

入力型が一致せず、(暗黙的な変換を使用して) 一致するように変換できない候補関数を破棄します。未知のリテラルは、この目的のために何にでも変換できると想定されています。

大胆強調鉱山。
の登録されたキャスト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は、他の場合と同様に、式で暗黙的に意味します。

CREATE CAST の章で、3 つの異なるタイプの代入 について詳しく読んでください。

于 2013-01-25T15:09:28.383 に答える
1

Erwin Brandstetterの答えに対する代替アプローチ

言語列をregconfigタイプに定義すると、クエリが少し冗長になります。

CREATE TABLE languages(language regconfig NOT NULL DEFAULT 'english'::regconfig)

上記のデフォルトとして英語を設定しましたが、これは必須ではありません。その後、元のクエリ

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

うまくいくでしょう。

于 2014-02-24T18:16:16.520 に答える