Как преобразовать тип данных в json в Postgresql - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу привести тип данных земного шара к массиву json в Postgresql (9.5).

Вот что у меня есть:

CREATE OR REPLACE FUNCTION earth_to_json (inpt earth)
RETURNS json AS $$
    SELECT json_build_array(latitude(inpt), longitude(inpt))
$$ LANGUAGE SQL;

CREATE CAST (earth AS JSON) WITH FUNCTION earth_to_json(earth) AS IMPLICIT;

При выполнении запроса выше я получаюследующий вывод:

WARNING: cast will be ignored because the source data type is a domain 
CREATE CAST 
Query returned successfully in 47 msec.

Таким образом, тип данных earth является доменом, согласно сообщению выше.Я знаю, что earthdistance основана на модуле куба, но я предположил, что тип данных earth является реальным типом данных, поэтому я должен иметь возможность привести.

Так что, если приведенный выше код должен работать, приведенный ниже код должен работать нормально.

SELECT ll_to_earth(10.10, 30.01)::JSON

Но я получаю ошибку

 ERROR: cannot cast type earth to json LINE 1

1 Ответ

0 голосов
/ 26 апреля 2019

Что я узнал:

Тип данных earth не является реальным типом данных. Это куб типа с ограничениями (ограничения определены в земной области). Поэтому мне действительно нужно создать приведение, которое приводит тип данных куба к json.

Если у вас случайно есть куб с подгонкой в ​​земной области, он будет возвращен как массив lat, lon. Вы можете создать свой собственный тип данных, чтобы обойти это. Для меня это работает нормально, так как я не использую тип данных куба.

CREATE OR REPLACE FUNCTION cube_to_json (inpt cube)
RETURNS json AS $$
BEGIN
    BEGIN
        RETURN json_build_array(latitude(inpt), longitude(inpt));
    EXCEPTION WHEN SQLSTATE '23514' THEN
        RETURN CASE WHEN json_array_length(sub) = 1 THEN sub->0 ELSE sub END FROM (SELECT translate('[' || inpt::TEXT || ']', '()', '[]')::JSON AS sub) AS o;
    END;
END;
$$ LANGUAGE plpgsql;


CREATE CAST (cube AS json) WITH FUNCTION cube_to_json(cube) AS IMPLICIT
-- Now test
SELECT (ll_to_earth(10,20))::JSON; -- Outputs [10,20]
SELECT ('(5437508.36471516, 3140612.41127573), (118.44062468, 1)'::CUBE)::JSON; -- Outputs "[[5437508.36471516, 3140612.41127573], [118.44062468, 1]]"
...