Использование условных обозначений (РЕГИСТР) для извлечения значения из другого поля, если основное запрашиваемое поле отсутствует или пустое

#postgresql

#postgresql

Вопрос:

У меня есть таблица Image

 id  | path      | additional                       | item_id 
1     /url/..     {"sm":"/url2/", "md": "/url3/"}            1     
  

additional является ли jsonb, который может быть Null, empty {} или со значениями

Я хочу проверить в jsonb, существует ли подобный ключ sm . Если ключ существует, верните значение, если нет, верните path .

Моя первоначальная идея — использовать CASE , но у меня проблема с проверкой и извлечением значения из массива

Комментарии:

1. Какой тип данных additional столбца?

2. Это реальный массив или jsonb ? Массив какого типа? Хранятся ли в базе данных необычные косые черты, как вы их показываете?

3. @LaurenzAlbe, это jsonb в PostgreSQL (я исправил, отображается в другом коде), значения отображаются в » «, как пары ключ-значение

Ответ №1:

Используйте coalesce() :

 select id, 
       coalesce(additional ->> 'sm', path) as path
from image;
  

Оператор ->> вернет null , если ключ не существует.

Комментарии:

1. даже если jsonb равен {} или null ?

2. @user3541631: да, даже тогда