类型为double precision的输入语法无效:查找经度/纬度最近的城市时为“ null”

时间:2018-07-10 15:51:07

标签: postgresql hibernate

我在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]错误:双精度类型的输入语法无效:“空”

注意:不能更改列类型,因为这会导致很多代码更改

1 个答案:

答案 0 :(得分:0)

您的一行中有一个字符串geohash作为经度或纬度的值。您可以通过更正数据来解决此问题:

ElasticSearch

或通过在查询中添加WHERE子句:

'null'

PS强烈建议将PostGIS用于此类操作。我知道您说您不能更改列类型,但是使用varchar列存储浮点数会带来麻烦,并且,如果您希望在任何时间维护该项目,则应更改列类型,以及何时更改列类型。您可以这样做,切换到PostGIS可以成为该过渡的一部分。这样一来,您的查询也将更加简洁。