Оператор Redshift — CASE проверяет, СУЩЕСТВУЕТ столбец или нет

#sql #amazon-redshift

#sql #amazon-redshift

Вопрос:

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

 select name, count(k_val) from tbl GROUP by 1 
  

Но в моем случае мне нужно сделать что-то вроде этого:

 select name, 
    SUM( (CASE when (select EXISTS( SELECT * FROM pg_table_def WHERE tablename = 'tbl'
                                            and "column" = 'k_val')) 
                then 1 else 0 end) ) as val  
    from tbl GROUP by 1
  

Я получаю сообщение об ошибке:

Ошибка SQL [500310] [0A000]: Недопустимая операция Amazon: указанные типы или функции (по одному на ИНФОРМАЦИОННОЕ сообщение) не поддерживаются в таблицах Redshift.;

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

1. Ваш пример эквивалентен COUNT(*) или 0 . Примеры данных и желаемые результаты помогли бы.

Ответ №1:

Ниже приведен трюк, который работает в большинстве баз данных для обработки отсутствующих столбцов.

 select t.*,
       (select k_val  -- intentionally not qualified
        from tbl t2
        where t2.pk = t.pk
       ) new_k_val
from tbl t cross join
     (select NULL as k_val) k;
  

pk является столбцом первичного ключа для таблицы. При этом используются правила определения области видимости для поиска значения для k_val . Если k_val находится в таблице, то подзапрос будет использовать значение из этой строки. Если нет, то область действия «вытянется» и примет значение из k . В этом случае нет никакой путаницы, потому что k_val ее нет в tbl .

Если вам по какой-то причине не нужен постоянный подзапрос, вы всегда можете использовать:

      (select NULL as k_val from t limit 1) k
  

Затем вы можете использовать это как подзапрос или CTE для целей агрегирования.

Сказав все это, я опасаюсь обращаться с недостающими столбцами таким образом.

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

1. Подтверждено, что это РАБОТАЕТ с Redshift (!)