Избегайте оценки типов PostgreSQL в инструкциях CASE - PullRequest
0 голосов
/ 27 декабря 2018

Я хочу выбрать значение ключа столбца, если этот столбец является jsonb.Если это не JSONB, я хочу просто выбрать столбец.

Вот код:

SELECT 
    CASE WHEN (pg_typeof(mycolumn)::text LIKE 'jsonb') 
        THEN mycolumn->>'mykey' 
        ELSE mycolumn 
    END
FROM mytable;

Это не работает, потому что каким-то образом mycolumn->>'mykey' все еще оценивается для столбцовкоторые не относятся к типу JSONB.

ОШИБКА: оператор не существует: [...] - >> неизвестно

СОВЕТ: ни один оператор не соответствует данному имени и типу аргумента (с).Вам может потребоваться добавить явные приведения типов.

Есть ли способ заставить проверку типов PostgreSQL принять это утверждение или есть другой способ сделать это?

1 Ответ

0 голосов
/ 27 декабря 2018

Как правило, вы можете сделать это, приведя результат запроса к text:

SELECT 
    CASE WHEN (pg_typeof(mycolumn)::text LIKE 'jsonb') 
        THEN (mycolumn::text::jsonb)->>'mykey' 
        ELSE mycolumn::text 
    END
FROM mytable;
...