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

Другие вопросы по тегам