尝试运行查询时出现 SQL 错误(double precision: “”类型输入语法无效)

SQL error (invalid input syntax for type double precision: "") when trying to run query

提问人:Garner Evans 提问时间:1/31/2023 更新时间:2/1/2023 访问量:509

问:

我正在使用世界卫生组织的 covid 数据进行采购,并且没有任何问题,直到这个特定查询不断抛出双精度的无效输入语法:“”错误。 我应该注意,这些表是从CSV文件导入的,我使用的是postgresql。

查询抛出错误:

select covid_deaths.continent, covid_deaths.location, covid_deaths.date, covid_deaths.population, covid_vacc.new_vaccinations,
SUM(covid_vacc.new_vaccinations::int) over (partition by covid_deaths.location 
order by covid_deaths.location, covid_deaths.date) as RollingPeopleVaccinated
from covid_deaths
join covid_vacc
on covid_deaths.location = covid_vacc.location and covid_deaths.date::date = covid_vacc.date::date

引发错误的行是第 3 行,尤其是 SUM(covid_vacc.new_vaccinations::int) 部分。covid_vacc表中的new_vaccinations列是 VARCHAR 数据类型,我知道强制转换不是一个很好的解决方案,但我非常努力避免必须从 excel 工作表中重新导入所有数据。Evne 如果我要这样做,不确定如何正确获取所有数据类型并清除空值的问题。

我尝试不将 new_vaccinations 列大小写,并将其转换为几种不同的数据类型。还尝试运行查询来更改new_vaccinations列的数据类型,但我认为这实际上不起作用。对 sql 来说相当新,因此任何帮助都值得赞赏。

PostgreSQL null SQLDatatypes

评论

1赞 Frank Heikens 1/31/2023
更新此列并将所有空字符串替换为 NULL
0赞 Adrian Klaver 2/1/2023
问题不在于值,而在于空字符串。NULL

答:

0赞 Adrian Klaver 2/1/2023 #1

使用 nullif 将空字符串转换为 .使用 trim 将空字符串缩短更长,然后缩短到函数。NULL''''nullif

Table "public.varchar_test"
   Column   |         Type          | Collation | Nullable | Default 
------------+-----------------------+-----------+----------+---------
 fld_1      | character varying(50) |           |          | 
 text_array | text[]                |           |          | 

insert into varchar_test(fld_1) values ('1'), (''), ('3');

select sum(fld_1::integer) from varchar_test ;
ERROR:  invalid input syntax for type integer: ""


select sum(nullif(fld_1::integer, '')) from varchar_test ;
ERROR:  invalid input syntax for type integer: ""


select sum(nullif(trim(fld_1), '')::integer) from varchar_test ;
 sum 
-----
   4

因此,就您而言:

SUM(nullif(trim(covid_vacc.new_vaccinations), '')::integer)

仅供参考,以上内容不会处理以下问题:

select '1,000'::float;
ERROR:  invalid input syntax for type double precision: "1,000"

select 'a'::float;
ERROR:  invalid input syntax for type double precision: "a"

这意味着可能仍需要对列进行数据清理。