Apache Calcite выдает ошибку при использовании COALESCE только с нетипизированными нулями
Когда бег SELECT COALESCE(NULL, NULL);
на Apache Calcite я получаю ошибку, которая говорит, что
Предложение ELSE или хотя бы одно предложение THEN должно быть ненулевым
Это происходит потому, что COALESCE
функция преобразуется в CASE
выражение и последний проверяется на наличие хотя бы одного THEN
или же ELSE
операнд не является нулевым. Если все NULL
, то ошибка выдается. Это мотивировано причинами, описанными в комментарии, найденном в исходном коде:
в соответствии со стандартом SQL мы не можем иметь все операторы THEN и ELSE, возвращающие нуль
Стоит отметить, что этот запрос возвращает NULL
когда какой-либо из параметров явно приведен, например SELECT COALESCE(CAST(NULL AS VARCHAR), NULL);
,
Однако я не мог найти это нигде. Я обнаружил следующее (см. Раздел "Сокращения, чтобы справиться с нулем", выделение мое):
Coalesce возвращает первый ненулевой параметр (или ноль, если все параметры нулевые).
Это утверждение, приведенное выше, похоже, соответствует документам Oracle и PostreSQL.
Мой вопрос, должен COALESCE
содержащий буквальный NULL
Работать только в соответствии со стандартом SQL?
1 ответ
Это слишком долго для комментария.
Вопрос о том, должно ли что-либо работать только в соответствии со стандартом SQL, может быть предметом академических дискуссий, но дело не в том, как работают базы данных. Насколько я знаю, каждая база данных имеет свои причуды, расширения и исключения из стандарта. Это просто факт того, что разные поставщики предоставляют такой язык.
В большинстве языков я думаю, что нетипизированный NULL
заканчивается типом по умолчанию. Я определяю что это, сохраняя select NULL
в таблицу (используя любой метод, который используется для этой базы данных) и глядя на тип.