我试图将浮动类型的纬度和经度列转换为
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
中的地理类型是否不同?
如果可以,我该如何转换它?
我会使用 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)||')'
)