相关推荐recommended
Pgsql报错: invalid input syntax for integer:‘ ‘
作者:mmseoamin日期:2024-01-19

业务sql偶尔会报错,意思是给integer了空字符串

invalid input syntax for integer:' '

起初我以为是alarm.status in () 这里传参问题,

因为我试了几次 把1换成2就不会报出这个错误,但看了很久也没发现1为什么会被认为是空字符

后来才发现,是因为类型强转的问题,应该是status为1时,camera.device_id为空了,导致强转为integer失败,因此报错;

修改前:

 select alarm.*,camera.status as camera_status, region.name
 from ai.alarm_log alarm 
 left join ai.camera on alarm.camera_id = camera.id 
 left join vcenter.device d on d.id = camera.device_id::INTEGER left join ai.region on region.id = d.org_id::BIGINT 
 WHERE alarm.start_time BETWEEN to_timestamp(1692806400) AND to_timestamp(1693497599) 
 AND alarm.status in (0,1)

所以我对强转的字段加了空值转换,就不会再出现这个问题了

修改后:

 select alarm.*, camera.status as camera_status, region.name 
 from ai.alarm_log alarm 
 left join ai.camera on alarm.camera_id = camera.id 
 left join vcenter.device d on d.id = COALESCE(NULLIF(camera.device_id,''),'0')::INTEGER  
 left join ai.region on region.id = COALESCE(NULLIF(d.org_id,''),'0')::BIGINT 
 WHERE alarm.start_time BETWEEN to_timestamp(1692806400) AND to_timestamp(1693497599) AND alarm.status in (0,1)