用零左填充文本字段

时间:2019-03-21 15:25:57

标签: sql postgresql sql-update

我有一个可以使用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,但这只会返回一个语法错误。

2 个答案:

答案 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;