我有一个使用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,''));
鉴于我正在使用这两列没有任何内容(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
然而,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 :(得分:6)
COALESCE
的工作原理是它假定第一个参数的数据类型,然后尝试将后续值转换为第一个数据类型。因此,以下显示相同的错误,因为''
无法转换为数字:
SELECT COALESCE(NULL::numeric, '')
通过将第一个参数转换为text
:
SELECT COALESCE(NULL::numeric::text, '')
因此,您的代码可以使用coalesce(length_m::text,'')
修复。
类似的方法是收集文本数组中的项目,然后join the array to a string收集' '
,''
收集空元素。
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],
' ', '')
)