Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ? / 25 сообщений из 26, страница 1 из 2
19.05.2012, 21:34
    #37802301
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
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
19.05.2012, 22:26
    #37802357
thehil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
Согласно 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
19.05.2012, 23:48
    #37802439
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
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
20.05.2012, 00:07
    #37802452
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
Таблоид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
20.05.2012, 01:46
    #37802513
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
sphinx_mvА почитать, что написано в документации по этой функции, не позволяют религиозные убеждения?А сам-то читал ? Здесь , например, ничего нет

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

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

СУБД 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
20.05.2012, 15:16
    #37802751
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
On 05/20/2012 01:51 PM, hvlad wrote:

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

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

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

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

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

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

-- MS SQL уже выдаёт результат без ошибки ?
Откуда он догадался, что безымянное поле производной таблицы `t` имеет числовой тип ? (Oracle в аналогичном варианте "остается верен себе" и НЕ выводит результат, возвращая ORA-00932).
...
Рейтинг: 0 / 0
21.05.2012, 10:45
    #37803364
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
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
21.05.2012, 12:22
    #37803607
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
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
21.05.2012, 13:42
    #37803768
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
Таблоид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
21.05.2012, 18:39
    #37804599
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ?
попробуйте NULLIF('',null) , думаю вам тоже понравиться
...
Рейтинг: 0 / 0
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Что должно выдать select nullif(null, 0) [from dual / rdb$database / ...] ? / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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