powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
25 сообщений из 26, страница 1 из 2
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802301
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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) ?
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802357
thehil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласно 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-выражении возвращать.
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802439
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thehilОраклу нужны видимо явные преобразования - NULLIF(TO_NUMBER(NULL),0)to_number не взлетел, пришлось через cast. Кроме того, сработала "явная формула", которую вы привели:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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 сработало только вот это:
Код: plaintext
select nullif( cast(null as int),0) f01

и не пропёрло с остальными:
Код: plaintext
1.
2.
3.
4.
5.
6.
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.

В общем, странновато как-то. На таком простом выражении и его вариациях три СУБД дают разные результаты.
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802452
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидhi all

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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) ?

А почитать, что написано в документации по этой функции, не позволяют религиозные убеждения?
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802513
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvА почитать, что написано в документации по этой функции, не позволяют религиозные убеждения?А сам-то читал ? Здесь , например, ничего нет

Зато есть здесь
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802521
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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` нельзя (не объясняя причины), а МС СКЛ - ничего не говорит. Ждёт, когда применят, чтобы шваброй стукнуть :-)
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802627
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНу да, прочёл я это:
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?
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802662
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> как-то жаль тратить время на такие очевидные вещи, как nullif, coalesce и т.д.
> Они ведь с царя гороха в SQL-стандарте, применяются повсеместно.

nullif нестандартный.
Пиши везде CASE-выражения, и всё будет переносимо, они стандартные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802672
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvА теперь просто задаем себе вопрос - какой тип данных у литерала NULL?И каким образом это связано с сообщение об ошибке ?
Не вижу смысла упираться - в MS признали, что сообщение кривое и изменили его (не могу сказать, что оно стало лучше :))
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802674
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivnullif нестандартныйГм. А может таки почитать стандарт ? Параграф 6.11 <case expression>
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802709
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladsphinx_mvА теперь просто задаем себе вопрос - какой тип данных у литерала NULL?И каким образом это связано с сообщение об ошибке ?
Ну, как бы сказать... Привести два аргумента к типу, к которому ничего не приводится, и сравнить что-то, что в принципе не особо можно с чем-либо сравнить - это надо постараться...
hvladНе вижу смысла упираться - в MS признали, что сообщение кривое и изменили его (не могу сказать, что оно стало лучше :))
Хотя бы одна из веток в CASE должна вернуть не-NULL результат - вполне отражает суть имеющей место проблемы.
Соответственно, что не так в сообщении об ошибке - не совсем понятно...
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802728
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид ,

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

PS: думаю, дело в поддержке неявных преобразований типов.
Например:select '3 яблока' + '4 груши' f01Результат:f017
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802751
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 05/20/2012 01:51 PM, hvlad wrote:

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

ОК, может это в стандарте и ЕСТЬ. Только всем на это плевать, ораклу в первую
очередь.
А CASE все поддерживают.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802778
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 :)
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802785
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivОК, может это в стандарте и ЕСТЬ. Только всем на это плевать, ораклу в первую
очередь.Не нужно рассказывать о [не]стандартности той или иной фичи, если сам стандарта в глаза не видел.

Причём тут оракл (в котором давно есть NULLIF) - я не понял.
Объяснять не нужно :)
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802805
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On 05/20/2012 04:52 PM, hvlad wrote:

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

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

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37802966
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitдумаю, дело в поддержке неявных преобразований типов.
select '3 яблока' + '4 груши' f01
Результат: 7
это древняя фишка языка MUMPS. Грубо говоря, там чисел вообще нет, одни строки. И также означает, что в Cache кривой sql.
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803018
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvэто древняя фишка языка MUMPS
Фишкой было бы, если бы результат был "7 фруктов". А так это обычный баг парсера, который
игнорит хвост литерала.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803057
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvэто древняя фишка языка MUMPS. Грубо говоря, там чисел вообще нет, одни строки. И также означает, что в Cache кривой sql.В качестве примера был приведён SQL-запрос, а не код на MUMPS: Типы данных в SQL
Dimitry SibiryakovФишкой было бы, если бы результат был "7 фруктов". А так это обычный баг парсера, который
игнорит хвост литерала.Это не баг, а неявное приведение типов.
Например:select '3.3 яблока' + '4.1e2 груш' as f01Результат:f01413.3select '3.3 яблока' || '4.1e2 груш' as f01Результат:f013.3 яблока4.1e2 груш
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803062
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitВ качестве примера был приведён SQL-запрос, а не код на MUMPS
Это не баг, а неявное приведение типов.
не рассказывайте мне что такое Cache, MUMPS, ДИАМС, приведение типов, и т.п., я и сам знаю.
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803233
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvдля MSSQL указано - возвращаемый результат функции имеет тип данных первого аргумента.раз всё так просто и понятно, как объяснить, что в этом примере:
Код: sql
1.
select nullif((select null),0)

-- MS SQL уже выдаёт результат без ошибки ?
Откуда он догадался, что безымянное поле производной таблицы `t` имеет числовой тип ? (Oracle в аналогичном варианте "остается верен себе" и НЕ выводит результат, возвращая ORA-00932).
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803364
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, сообщение всё же человеческое :
Код: sql
1.
2.
3.
4.
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.
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803607
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladсообщение всё же человеческое :<...>
Код: sql
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.

Это сообщение не объясняет, каким образом MS SQL умудряется узнать тип ПЕРВОГО аргумента в NULLIF'e в предыдущем примере.
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37803768
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидsphinx_mvдля MSSQL указано - возвращаемый результат функции имеет тип данных первого аргумента.раз всё так просто и понятно, как объяснить, что в этом примере:
Код: sql
1.
select nullif((select null),0)

-- MS SQL уже выдаёт результат без ошибки ?
Откуда он догадался, что безымянное поле производной таблицы `t` имеет числовой тип ? (Oracle в аналогичном варианте "остается верен себе" и НЕ выводит результат, возвращая ORA-00932).
"Фича" MSSQL, однако...
Тип данных колонки xxx в запросе вида select null as xxx - int...
...
Рейтинг: 0 / 0
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
    #37804599
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте NULLIF('',null) , думаю вам тоже понравиться
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]