您可以投出real[]
到float[]
:
CASE WHEN z > 16 THEN concat('{"cityJson" :', cityjsonfeature::TEXT,
', "metadata" : {',
'"translate:"','{', m.translate::float[]::text,'},',
'"scale:"','{', m.scale ,'}')
ELSE NULL
END AS cityjson,
这正是它要做的:demo
select ('{98.016,1.3326125e+06,6.7176775e+06}'::real[])::float[];
float8 |
{98.01599884033203,1332612.5,6717677.5} |
请注意,该数组的文本表示不会遵循SON数组语法.{
个是用于杨森对象,而不是array.您还可以将它们添加到文本表示附带的花括号顶部,这进一步打破了问题.出于同样的原因,您的scale
最终也会畸形.
您还将逗号放入键名称"translate:"
和"scale:"
中,而不是放在它们"translate":
、"scale":
之后.您可以通过使用json_build_object()
函数而不是手动构建来避免此类手动错误.它还会为您将您的PostgreSQL数组重新格式化为有效的SONarray.如果您需要为人类可读性而格式化输出,您还可以使用jsonb
版本访问jsonb_pretty()
:demo
SELECT
CASE WHEN z > 16
THEN jsonb_pretty(
jsonb_build_object(
'cityJson',cityjsonfeature
,'metadata',jsonb_build_object(
'translate',m.translate
,'scale',m.scale )
)
)
ELSE NULL
END AS cityjson
FROM test AS m;
请注意,它还自动处理删除花括号以及real[]
类型值中的指数符号,因此您不再需要::float[]
了.
cityjson |
{ "cityJson": { "somekey": "someVal" }, "metadata": { "scale": [ 98.016, 1332612.5, 6717677.5 ], "translate": [ 98.01599884033203, 1332612.5, 6717677.5 ] } } |
有时为了冗长而添加ELSE NULL
,但这是默认行为,因此可以省略.