将 SQL 地理类型列加载到 Vertica 时出错

问题描述 投票:0回答:1

我试图将浮动类型的纬度和经度列转换为

SQL
中的地理类型,然后将它们加载到
Vertica table
中。 我使用以下代码将列转换为地理类型:

CASE WHEN (Latitude IS NOT NULL AND Longitude IS NOT NULL)
                THEN geography::Point(Latitude, Longitude, 4326)
                ELSE NULL END AS Coordinates 

但是在尝试将数据从

SQL
加载到地理类型的
Vertica column
时,出现以下错误:

ERROR: COPY: Input record 1 has been rejected (Row [1] rejected due to materialized type error on column: [Coordinates] with value: [POINT (-96.8922825 33.08097)].)

SQL
Vertica
中的地理类型是否不同?

如果可以,我该如何转换它?

sql database etl vertica sqlgeography
1个回答
0
投票

我会使用 Vertica 函数,因为您可以在文档中找到它们。

对我来说,它是这样工作的:

WITH indata(latitude,longitude) AS (
            SELECT -96.8922825, 33.08097
  UNION ALL SELECT NULL       , 33.08097
  UNION ALL SELECT -96.8922825, NULL
)
-- transform to geography type ...
,to_geo(geo) AS (
  SELECT
    ST_GeographyFromText(
      'POINT('||latitude::VARCHAR(16)||' '||longitude::VARCHAR(16)||')'
    )
  FROM indata
)
-- transform back to well-known-text ...
SELECT ST_AsText(geo) FROM to_geo;
-- out           ST_AsText                                                                                                                                                                              
-- out ------------------------------
-- out  POINT (-96.8922825 33.08097)
-- out  (null)
-- out  (null)

你不需要 CASE WHEN 表达式。如果一个操作数为 NULL,则结果也为 NULL。所以只需使用:

    ST_GeographyFromText(
      'POINT('||latitude::VARCHAR(16)||' '||longitude::VARCHAR(16)||')'
    )
© www.soinside.com 2019 - 2024. All rights reserved.