Ниже приведен трюк, который работает в большинстве баз данных для обработки пропущенных столбцов.
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 для целей агрегирования.
Сказав все это, я опасаюсь обрабатывать пропущенные столбцы таким образом.