我有一个可以使用PGAdmin III访问的postgres数据库。我运行一个脚本来更改存储在文本字段中的数字,然后添加左零以将其归档为四个字符。这是一个时间字段,必须存储为文本。我想一次运行而不是两次。这是将小时数添加为文本的第一个子句;
UPDATE timetable
SET eta = (
CASE
WHEN (trips.starttime::int / 100) + (destination.zuluoffset * -1 ) < 24 THEN ((trips.starttime::int / 100) + (destination.zuluoffset * -1 )) * 100
WHEN (trips.starttime::int / 100) + (destination.zuluoffset * -1 ) > 23 THEN ((trips.starttime::int / 100) + (destination.zuluoffset * -1 ) - 24) * 100
END )
FROM
destination,
trips
WHERE
timetable.tripsid = trips.id;
这很好,可以增加所需的小时数,同时校正大于24小时的结果。但是,此时间在少于1000小时的任何时间都为三位数,甚至在午夜时为零。该字段必须为4个字符。
所以我将此作为第二个子句运行
UPDATE timetable
SET eta = lpad(eta, 4, '0');
,这也适用。但是如何将lpad添加到第一个Update子句中?我试图将整个CASE语句放在lpad语句中,而不是像这样的eta;
SET eta = lpad((CASE statement here), 4, '0')
但我收到此错误;
ERROR: function lpad(numeric, integer, unknown) does not exist
LINE 3: SET eta = lpad((
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
我尝试使用:: int,:: text和:: varchar转换eta,但这只会返回一个语法错误。
答案 0 :(得分:1)
应为 UPDATE timetable
SET eta = LPAD ((
CASE
WHEN (trips.starttime::int / 100) + (destination.zuluoffset * -1 ) < 24 THEN ((trips.starttime::int / 100) + (destination.zuluoffset * -1 )) * 100
WHEN (trips.starttime::int / 100) + (destination.zuluoffset * -1 ) > 23 THEN ((trips.starttime::int / 100) + (destination.zuluoffset * -1 ) - 24) * 100
END )::text, 4,'0')
FROM destination
INNER JOIN trips ON timetable.tripsid = trips.id;
monom
答案 1 :(得分:1)
如果CASE语句的结果为数字,为什么要使用LPAD,只需使用to_char:
UPDATE timetable
SET eta = to_char (
CASE
WHEN (trips.starttime::int / 100) + (destination.zuluoffset * -1 ) < 24 THEN ((trips.starttime::int / 100) + (destination.zuluoffset * -1 )) * 100
WHEN (trips.starttime::int / 100) + (destination.zuluoffset * -1 ) > 23 THEN ((trips.starttime::int / 100) + (destination.zuluoffset * -1 ) - 24) * 100
END , 'FM0000')
FROM destination
INNER JOIN trips ON timetable.tripsid = trips.id;