Redshift - столбец проверки оператора CASE существует или отсутствует - PullRequest
0 голосов
/ 11 марта 2019

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

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: указанные типы или функции (по одному на каждое сообщение INFO) не поддерживаются в таблицах Redshift.;

1 Ответ

2 голосов
/ 11 марта 2019

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

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 для целей агрегирования.

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

...