【问题标题】:Invalid input syntax for type double precision: "null" when finding nearest city with longitude/latitude双精度类型的输入语法无效:查找最近的经度/纬度城市时为“null”
【发布时间】:2018-07-11 03:43:30
【问题描述】:

我在 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”

注意:没有更改列类型的选项,因为这会导致大量代码更改

【问题讨论】:

    标签: postgresql hibernate


    【解决方案1】:

    您的其中一行将字符串 '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 可以成为该过渡的一部分。因此,您的查询也将更加清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多