如何使用 Snowflake 将地理类型转换为字符串?

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

我很惊讶这是不可能的。有替代方案吗?

SELECT st_point(37.5, 45.5)::string;
-- SQL compilation error: invalid type [CAST(ST_POINT(TO_DOUBLE(37.5), TO_DOUBLE(45.5)) AS VARCHAR(16777216))] for parameter 'TO_VARCHAR'

我想这样做的原因是我正在使用

st_collect
,它返回一个多点对象。我想将多点转换为线串,但显然
st_makeline
只允许 2 个点,而我有很多。

一个简单的修复方法是替换字符串,但似乎不允许。

snowflake-cloud-data-platform
1个回答
0
投票

ST_ASTEXT 或 ST_ASWKT 满足您的需求吗?

SELECT 
    st_point(37.5, 45.5) as x,
    SYSTEM$TYPEOF(x),
    ST_ASTEXT(x),
    ST_ASWKT(x),
    ST_ASEWKT(x);
X 系统$类型(X) ST_ASTEXT(X) ST_ASWKT(X) ST_ASEWKT(X)
{"坐标": [3.750000000000000e+01, 4.550000000000000e+01], "类型": "点"} 变体[LOB] 点(37.5 45.5) 点(37.5 45.5) SRID=4326;点(37.5 45.5)

更长的答案是,当添加新数据类型时,它们通常是由 Snowflake 以 MVP 方式添加的,因此它们以它们需要/意图的核心方式工作,并且 100% 所有其他方式/类型都可能滞后或只是从来没有支持过。在某种程度上,这可能会令人沮丧,一种“做事并不适用于所有事情”的风格,但相反,如果您能看到如何按预期使用它们,那么还有更有用的东西。

上面我要求“typeof”的原因是“如果是 VARIANT 变体函数应该很高兴,但 GET 不高兴,并显示:

SELECT st_point(37.5, 45.5) as x, SYSTEM$TYPEOF(x), get(x, 'type');

001044 (42P13):SQL 编译错误:位置 52 处出现错误第 1 行

Invalid argument types for function 'GET': (GEOGRAPHY, VARCHAR(4))

所以它说它是一个变体,但知道它是一个 GROGRAPHY.. 让我们投射:

SELECT st_point(37.5, 45.5) as x, SYSTEM$TYPEOF(x), get(x::variant, 'type');

Invalid type [CAST(X AS VARIANT)] for parameter 'TO_VARIANT'

所以这里存在类型支持的缺口。如果这对您的业务使用至关重要,我会开具支持票,并且考虑到它很可能“不是错误”,只是支持方面的差距,它不会很快改变,因此在这两种情况下都是最有意义的,寻找另一种方法来实现你的目标。

© www.soinside.com 2019 - 2024. All rights reserved.