8

NUMERIC 型を使用した 3 つの列を持つテーブルがあります。ただし、そのうちの 2 つは何もありません (つまり、空です)。コードは次のとおりです。

CREATE TABLE profiles(
ID SMALLINT,
FID SMALLINT,
SURVEY VARCHAR(100),
PROFILE VARCHAR(100),
TYPE VARCHAR(100),
SOURCE VARCHAR(100),
NR_TRACES NUMERIC,
TRACE_SPACE_M NUMERIC,
LENGTH_M NUMERIC,
IMAGES TEXT,
COMMENTS TEXT
);

ALTER TABLE profiles ADD ts tsvector;

UPDATE profiles SET ts = to_tsvector('english', ID || ' ' || FID || ' ' || coalesce(SURVEY,'') || ' ' || coalesce(PROFILE,'') || ' ' || coalesce(TYPE,'') || ' ' || coalesce(SOURCE,'') || ' ' || coalesce(NR_TRACES,'') || ' ' || coalesce(TRACE_SPACE_M,'') || ' ' || coalesce(LENGTH_M,'') || ' ' || coalesce(IMAGES,'') || ' ' || coalesce(COMMENTS,''));

これらの 2 つの列 (NR_TRACES と TRACE_SPACE_M) に何も含まれていない ts 列を更新すると、ts 列には値が入力されません。その後、両方の列を次のように更新したため、空であることがわかりました。

UPDATE profiles SET nr_traces = 10131, trace_space_m = 12.5 WHERE PROFILE = '30';

そして得た:

ERROR:  invalid input syntax for type numeric: ""

ERROR:  tsvector column "TS" does not exist

ただし、列 LENGTH_M は完全に入力されているため、「数値」型では、私が使用している方法では結合できないと言えます。以下のものも成功せずに使用しました:

coalesce(my-numeric-empty-column,'')
coalesce(my-numeric-empty-column,'')::numeric

入力された LENGTH_M 列を単独でテストすると、「」(空の) スペースを指す同じ結果が得られます。

psql:profiles.sql:146: ERROR:  invalid input syntax for type numeric: ""
LINE 1: ... ' ' || TRACE_SPACE_M || ' ' || coalesce(LENGTH_M,'') || ' '...
                                                         ^

そもそもこれらの 2 つの空の列にデータを入力せずに、これを回避するにはどうすればよいですか?

これに関するヒントをいただければ幸いです。事前に感謝します。

4

1 に答える 1

12

最初の引数のデータ型を想定し、後続COALESCEの値を最初のデータ型にキャストしようとします。したがって、以下は''数値としてキャストできないため、同じエラーを示しています。

SELECT COALESCE(NULL::numeric, '')

これは、最初の引数を にキャストすることで修正されますtext

SELECT COALESCE(NULL::numeric::text, '')

したがって、コードは を使用して修正できますcoalesce(length_m::text,'')


同様のアプローチは、アイテムをテキスト配列に収集し、その配列を, およびnull 要素の文字列に結合することです。' '''

UPDATE profiles
SET
  ts = to_tsvector(
    'english',
    array_to_string(
      ARRAY[id::text, fid::text, survey, profile, type, source,
            nr_traces::text, trace_space_m::text, length_m::text,
            images, comments],
    ' ', '')
  )
于 2013-11-24T23:40:17.760 に答える