2013-11-24 35 views
1

我有一個使用NUMERIC類型的三列表。然而,其中兩個沒有任何東西(即空的)。這是代碼:「數字類型的輸入語法無效」,用於輸入「空白」

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,'')); 

因爲我更新我的TS具有對他們(NR_TRACES和TRACE_SPACE_M)沒有這兩列列,在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,'') || ' '... 
                 ^

我如何規避這沒有填充這兩個空列的第一個地方?

我會很感激任何提示,在此先感謝。

+0

看起來您正在更新'numeric'列,而不是'tsvector'列。此外,要在SQL中引用大寫的TS名稱,則需要雙引號,例如' 「TS」'。 –

+0

@MikeToews感謝Mike的回覆。實際上,ts列正在通過更新聲明進行填充。請參閱我的問題了解更多信息,我最近更新了它。 – Gery

回答

4

COALESCE的工作原理是它從第一個參數中取得數據類型,然後嘗試將後續值轉換爲第一個數據類型。所以下面給出了同樣的錯誤,因爲''不能轉換爲數字:

SELECT COALESCE(NULL::numeric, '') 

這是由鑄造的第一個參數text固定:

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

因此您的代碼可以使用coalesce(length_m::text,'')固定。


一種類似的方法是收集的項目在文本陣列,然後用' 'join the array to a string,和''爲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], 
    ' ', '') 
) 
+0

感謝邁克,即使這有效,如果我更新這些數字列'更新配置文件SET nr_traces = 10131,trace_space_m = 12.5 WHERE PROFILE = '93 -30';'仍然出現tsvector列「TS」不存在' ,所以我不能用數字更新這些列? – Gery

+0

只是爲了指出我有一個插入或更新的觸發器,例如:'CREATE TRIGGER tsvectorupdate BEFORE插入或更新配置文件FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger('TS','pg_catalog。英文',身份證,FID,調查,簡介,類型,來源,NR_TRACES,TRACE_SPACE_M,LENGTH_M,IMAGES,COMMENTS);',這裏是我認爲的問題 – Gery

+0

由於postgres大小寫,列名需要爲'ts'' -敏感。或者,您可以將列名重新命名爲「TS」,但從長遠來看,總是雙重引用事情是令人討厭的。 –

相關問題