#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 (!)