提问人:Garner Evans 提问时间:1/31/2023 更新时间:2/1/2023 访问量:509
尝试运行查询时出现 SQL 错误(double precision: “”类型输入语法无效)
SQL error (invalid input syntax for type double precision: "") when trying to run query
问:
我正在使用世界卫生组织的 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 来说相当新,因此任何帮助都值得赞赏。
答:
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"
这意味着可能仍需要对列进行数据清理。
评论
NULL