Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
hi all

Firebird 2.5:
SQL> select nullif(null,0) f01 from rdb$database;

F01
======
<null>

Oracle 11.2.0.3.0:
SQL> select nullif(null,0) f01 from dual;
select nullif(null,0) f01 from dual
*
ошибка в строке 1:
ORA-00932: несовместимые типы данных: ожидается -, получено CHAR

MS SQL 2005 Developer edition:

select nullif(null,0) f01
Msg 8133, Level 16, State 1, Line 1
None of the result expressions in a CASE specification can be NULL.

Так должна ли вспыхивать ошибка или нет в случае выборки nullif(null, 0) ?
19 май 12, 21:34    [12582723]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
thehil
Member

Откуда:
Сообщений: 70
Согласно SQL-92 (не уверен насчет последующих версий):
NULLIF (V1, V2) is equivalent to the following <case specification>: CASE WHEN V1=V2 THEN NULL ELSE V1 END
Т.е. CASE WHEN NULL=0 THEN NULL ELSE NULL END, теоретически не должно вызывать ошибок.
Ораклу нужны видимо явные преобразования - NULLIF(TO_NUMBER(NULL),0), а МС судя по ошибке вообще не умеет NULL в case-выражении возвращать.
19 май 12, 22:26    [12582947]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
thehil
Ораклу нужны видимо явные преобразования - NULLIF(TO_NUMBER(NULL),0)
to_number не взлетел, пришлось через cast. Кроме того, сработала "явная формула", которую вы привели:
SQL> select nullif( to_number(null),0) f01 from dual;
select nullif( to_number(null),0) f01 from dual
*
ошибка в строке 1:
ORA-00932: несовместимые типы данных: ожидается -, получено NUMBER


SQL> select nullif( cast(null as number),0) f01 from dual;

F01
----------


SQL> select case when null=0 then null else null end f01 from dual;

F
-

В ms sql сработало только вот это:
select nullif( cast(null as int),0) f01

и не пропёрло с остальными:
select case when null=0 then null else null end
Msg 8133, Level 16, State 1, Line 1
None of the result expressions in a CASE specification can be NULL.

select case when cast(null as int)=0 then null else null end
Msg 8133, Level 16, State 1, Line 1
None of the result expressions in a CASE specification can be NULL.

В общем, странновато как-то. На таком простом выражении и его вариациях три СУБД дают разные результаты.
19 май 12, 23:48    [12583354]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Таблоид
hi all

Firebird 2.5:
SQL> select nullif(null,0) f01 from rdb$database;

F01
======
<null>

Oracle 11.2.0.3.0:
SQL> select nullif(null,0) f01 from dual;
select nullif(null,0) f01 from dual
*
ошибка в строке 1:
ORA-00932: несовместимые типы данных: ожидается -, получено CHAR

MS SQL 2005 Developer edition:

select nullif(null,0) f01
Msg 8133, Level 16, State 1, Line 1
None of the result expressions in a CASE specification can be NULL.

Так должна ли вспыхивать ошибка или нет в случае выборки nullif(null, 0) ?


А почитать, что написано в документации по этой функции, не позволяют религиозные убеждения?
20 май 12, 00:07    [12583433]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
hvlad
Member

Откуда:
Сообщений: 11554
sphinx_mv
А почитать, что написано в документации по этой функции, не позволяют религиозные убеждения?
А сам-то читал ? Здесь, например, ничего нет

Зато есть здесь
20 май 12, 01:46    [12583765]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
sphinx_mv
А почитать, что написано в документации по этой функции, не позволяют религиозные убеждения?
как-то жаль тратить время на такие очевидные вещи, как nullif, coalesce и т.д. Они ведь с царя гороха в SQL-стандарте, применяются повсеместно.
Может, еще и арифметику проверять следует на каждом выражении ?
Ну да, прочёл я это:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions107.htm#SQLRF00681
http://msdn.microsoft.com/en-us/library/ms177562%28SQL.100%29.aspx

Оракл прямо говорит, что юзать литерал `null` нельзя (не объясняя причины), а МС СКЛ - ничего не говорит. Ждёт, когда применят, чтобы шваброй стукнуть :-)
20 май 12, 02:07    [12583800]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Таблоид
Ну да, прочёл я это:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions107.htm#SQLRF00681
http://msdn.microsoft.com/en-us/library/ms177562%28SQL.100%29.aspx

Оракл прямо говорит, что юзать литерал `null` нельзя (не объясняя причины), а МС СКЛ - ничего не говорит. Ждёт, когда применят, чтобы шваброй стукнуть :-)

Я не знаю, кого и куда нужно стукнуть, но для MSSQL указано - возвращаемый результат функции имеет тип данных первого аргумента. Для Oracle указано, что оба аргумента должны быть одинакового типа. А теперь просто задаем себе вопрос - какой тип данных у литерала NULL?
20 май 12, 12:02    [12584085]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709


> как-то жаль тратить время на такие очевидные вещи, как nullif, coalesce и т.д.
> Они ведь с царя гороха в SQL-стандарте, применяются повсеместно.

nullif нестандартный.
Пиши везде CASE-выражения, и всё будет переносимо, они стандартные.

Posted via ActualForum NNTP Server 1.5

20 май 12, 12:38    [12584153]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
hvlad
Member

Откуда:
Сообщений: 11554
sphinx_mv
А теперь просто задаем себе вопрос - какой тип данных у литерала NULL?
И каким образом это связано с сообщение об ошибке ?
Не вижу смысла упираться - в MS признали, что сообщение кривое и изменили его (не могу сказать, что оно стало лучше :))
20 май 12, 12:49    [12584178]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
hvlad
Member

Откуда:
Сообщений: 11554
MasterZiv
nullif нестандартный
Гм. А может таки почитать стандарт ? Параграф 6.11 <case expression>
20 май 12, 12:51    [12584183]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
hvlad
sphinx_mv
А теперь просто задаем себе вопрос - какой тип данных у литерала NULL?
И каким образом это связано с сообщение об ошибке ?

Ну, как бы сказать... Привести два аргумента к типу, к которому ничего не приводится, и сравнить что-то, что в принципе не особо можно с чем-либо сравнить - это надо постараться...
hvlad
Не вижу смысла упираться - в MS признали, что сообщение кривое и изменили его (не могу сказать, что оно стало лучше :))

Хотя бы одна из веток в CASE должна вернуть не-NULL результат - вполне отражает суть имеющей место проблемы.
Соответственно, что не так в сообщении об ошибке - не совсем понятно...
20 май 12, 14:03    [12584304]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3148
Блог
Таблоид,

СУБД Caché 2012.2.FT3
select nullif(null,0) f01
select nullif(to_number(null),0) f01
select nullif(cast(null as numeric),0) f01
Результат одинаков для всех трёх запросов:
f01
null

NULLIF

PS: думаю, дело в поддержке неявных преобразований типов.
Например:
select '3 яблока' '4 груши' f01
Результат:
f01
7
20 май 12, 14:42    [12584359]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 05/20/2012 01:51 PM, hvlad wrote:

> nullif нестандартный
>
> Гм. А может таки почитать стандарт ? Параграф 6.11 <case expression>

ОК, может это в стандарте и ЕСТЬ. Только всем на это плевать, ораклу в первую
очередь.
А CASE все поддерживают.

Posted via ActualForum NNTP Server 1.5

20 май 12, 15:16    [12584418]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
hvlad
Member

Откуда:
Сообщений: 11554
sphinx_mv,

еще раз - сообщение об ошибке никак не помогает понять её суть.
Это признано даже в МС, так что не надо с этим спорить. Это уже
даже не забавно, а просто глупо.

Далее. Новое сообщение
To: At least one of the result expressions in a CASE specification must be an expression other than the NULL constant.
никак не связано с ф-цией NULLIF, поэтому не менее кривое чем первое.

Можно с большой долей уверенности говорить о том, что средний пользователь
MSSQL понятия не имеет не только о том, что NULLIF есть частный случай CASE,
но и не скажет где находится result expression в CASE specification :)
20 май 12, 15:49    [12584485]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
hvlad
Member

Откуда:
Сообщений: 11554
MasterZiv
ОК, может это в стандарте и ЕСТЬ. Только всем на это плевать, ораклу в первую
очередь.
Не нужно рассказывать о [не]стандартности той или иной фичи, если сам стандарта в глаза не видел.

Причём тут оракл (в котором давно есть NULLIF) - я не понял.
Объяснять не нужно :)
20 май 12, 15:52    [12584499]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

On 05/20/2012 04:52 PM, hvlad wrote:

> ОК, может это в стандарте и ЕСТЬ. Только всем на это плевать, ораклу в первую
> очередь.
>
> Не нужно рассказывать о [не]стандартности той или иной фичи, если сам стандарта
> в глаза не видел.
>
> Причём тут оракл (в котором давно есть NULLIF) - я не понял.

О, спасибо!
ТЫ разскрыл мне глаза на правду!

Posted via ActualForum NNTP Server 1.5

20 май 12, 16:07    [12584534]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30253
servit
думаю, дело в поддержке неявных преобразований типов.
select '3 яблока' + '4 груши' f01
Результат: 7

это древняя фишка языка MUMPS. Грубо говоря, там чисел вообще нет, одни строки. И также означает, что в Cache кривой sql.
20 май 12, 19:12    [12585015]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

kdv
это древняя фишка языка MUMPS

Фишкой было бы, если бы результат был "7 фруктов". А так это обычный баг парсера, который
игнорит хвост литерала.

Posted via ActualForum NNTP Server 1.5

20 май 12, 20:33    [12585261]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3148
Блог
kdv
это древняя фишка языка MUMPS. Грубо говоря, там чисел вообще нет, одни строки. И также означает, что в Cache кривой sql.
В качестве примера был приведён SQL-запрос, а не код на MUMPS: Типы данных в SQL
Dimitry Sibiryakov
Фишкой было бы, если бы результат был "7 фруктов". А так это обычный баг парсера, который
игнорит хвост литерала.
Это не баг, а неявное приведение типов.
Например:
select '3.3 яблока' '4.1e2 груш' as f01
Результат:
f01
413.3
select '3.3 яблока' || '4.1e2 груш' as f01
Результат:
f01
3.3 яблока4.1e2 груш
20 май 12, 21:45    [12585429]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 30253
servit
В качестве примера был приведён SQL-запрос, а не код на MUMPS
Это не баг, а неявное приведение типов.

не рассказывайте мне что такое Cache, MUMPS, ДИАМС, приведение типов, и т.п., я и сам знаю.
20 май 12, 21:51    [12585451]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
sphinx_mv
для MSSQL указано - возвращаемый результат функции имеет тип данных первого аргумента.
раз всё так просто и понятно, как объяснить, что в этом примере:
select nullif((select null),0)
-- MS SQL уже выдаёт результат без ошибки ?
Откуда он догадался, что безымянное поле производной таблицы `t` имеет числовой тип ? (Oracle в аналогичном варианте "остается верен себе" и НЕ выводит результат, возвращая ORA-00932).
21 май 12, 08:53    [12586178]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual  [new]
hvlad
Member

Откуда:
Сообщений: 11554
hvlad
Далее. Новое сообщение
To: At least one of the result expressions in a CASE specification must be an expression other than the NULL constant.
никак не связано с ф-цией NULLIF, поэтому не менее кривое чем первое.
Сейчас появилась возможность проверить на MSSQL 2008 SP3, сообщение всё же человеческое :
select nullif(null, 0)

.Net SqlClient Data Provider: Msg 4151, Level 16, State 1, Line 1
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
21 май 12, 10:45    [12586719]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
hvlad
сообщение всё же человеческое :<...>
The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
Это сообщение не объясняет, каким образом MS SQL умудряется узнать тип ПЕРВОГО аргумента в NULLIF'e в предыдущем примере.
21 май 12, 12:22    [12587537]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Таблоид
sphinx_mv
для MSSQL указано - возвращаемый результат функции имеет тип данных первого аргумента.
раз всё так просто и понятно, как объяснить, что в этом примере:
select nullif((select null),0)
-- MS SQL уже выдаёт результат без ошибки ?
Откуда он догадался, что безымянное поле производной таблицы `t` имеет числовой тип ? (Oracle в аналогичном варианте "остается верен себе" и НЕ выводит результат, возвращая ORA-00932).

"Фича" MSSQL, однако...
Тип данных колонки xxx в запросе вида select null as xxx - int...
21 май 12, 13:42    [12588212]     Ответить | Цитировать Сообщить модератору
 Re: Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3795
попробуйте NULLIF('',null) , думаю вам тоже понравиться
21 май 12, 18:39    [12590791]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить