postgresql - 双精度类型的输入语法无效:查找最近的经度/纬度城市时为“null”
问题描述
我在 PostgreSQL 数据库中有一个表。
表结构:
CREATE TABLE "public"."citydescription" (
"srno" int4 DEFAULT nextval('newcitydescription_srno_seq'::regclass) NOT NULL,
"cityname" varchar(40),
"country" varchar(40),
"airportcode" varchar(4),
"description" text,
"code" varchar,
"parentcity" int4,
"type" varchar DEFAULT 'city'::character varying,
"title" varchar,
"priority" varchar,
"isactive" bool DEFAULT true,
"sequence" int4,
"latitude" varchar,
"longitude" varchar,
"score" float8,
"state_province" varchar(2),
"population" text,
"isnew" bool,
"has_banner" bool DEFAULT false,
"hreflang" bool,
"au_href" varchar,
CONSTRAINT "newcitydescription_pkey" PRIMARY KEY ("srno")
)
WITH (OIDS=FALSE);
当我运行此查询时:
SELECT * FROM (
SELECT
*,
(
3959 * acos(
cos( radians(6.414478) ) *
cos( radians( CAST(latitude AS FLOAT) ) ) *
cos( radians( CAST(longitude AS FLOAT) ) - radians(12.466646) ) +
sin( radians(6.414478) ) *
sin( radians( CAST(latitude AS FLOAT) ) )
)
) AS distance
FROM citydescription
) al
WHERE distance < 5
ORDER BY distance
LIMIT 20;
它给出了这个错误:
[Err] 错误:双精度类型的无效输入语法:“null”
注意:没有更改列类型的选项,因为这会导致大量代码更改
解决方案
您的其中一行将字符串'null'
作为经度或纬度的值。您可以通过更正数据来解决此问题:
UPDATE citydescription SET latitude=NULL WHERE latitude='null';
UPDATE citydescription SET longitude=NULL WHERE longitude='null';
或通过在查询中添加 WHERE 子句:
SELECT * FROM (
SELECT
*,
(
3959 * acos(
cos( radians(6.414478) ) *
cos( radians( CAST(latitude AS FLOAT) ) ) *
cos( radians( CAST(longitude AS FLOAT) ) - radians(12.466646) ) +
sin( radians(6.414478) ) *
sin( radians( CAST(latitude AS FLOAT) ) )
)
) AS distance
FROM citydescription
WHERE
latitude != 'null' AND
longitude != 'null'
) al
WHERE distance < 5
ORDER BY distance
LIMIT 20;
PS 强烈建议使用 PostGIS 进行此类操作。我知道您说过您不能更改列类型,但是使用 varchar 列来存储浮点数是自找麻烦,如果您希望在任何时间维护这个项目,您应该更改列类型,以及何时您这样做,切换到 PostGIS 可以成为该过渡的一部分。因此,您的查询也将更加清晰。
推荐阅读
- node.js - node.js/react 使用 graphql createReadStream 上传文件不是函数
- php - PHP 使用用户先前保存的预选选项显示从数组值中多选
- javascript - Mongoose 查询查找并找到一个
- github - 使用 Github 管理 Mandrill 交易电子邮件
- android - 为什么我不能使用 AutoML VIsion TFLite 模型?
- swiftui - SwiftUI:Tabbar 的奇怪行为
- python - Pandas 在多列上使用应用功能进行扩展
- c++ - Array not initialized but includes curly brackets
- amazon-web-services - 如何让 Kinesis 使用 OIDC 令牌连接到 http 端点?
- javascript - TypeError:无法读取未定义的属性“参数”