Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 почему выдает 0  [new]
abort
Member

Откуда:
Сообщений: 625
Не могу понять, почему выдает 0

declare
	@i int = null
select ISNULL(@i, '')
24 апр 15, 13:14    [17558640]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
Не могу понять, почему выдает 0

Потому что число "пустая строка" не существует в природе.
24 апр 15, 13:16    [17558664]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

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

Эт я понимаю, почему не выдает ошибку
24 апр 15, 13:17    [17558676]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
Эт я понимаю, почему не выдает ошибку

Какой именно ошибки ?
24 апр 15, 13:19    [17558695]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Потому что документацию надо читать иногда.
источник
ISNULL ( check_expression , replacement_value )
Возвращает тот же тип, что и у аргумента check_expression. Если литерал NULL указывается в качестве check_expression, возвращает тип данных значения replacement_value. Если литерал NULL указывается в качестве check_expression и не указано никакого значения replacement_value, возвращает int.

CAST('' AS int) получаем 0
24 апр 15, 13:19    [17558699]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Gviber
Member

Откуда:
Сообщений: 124
select ISNULL(cast(@i as varchar), '')
24 апр 15, 13:22    [17558730]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

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

тогда почему вот это возвращает 0

SELECT CAST('-' AS int)
24 апр 15, 13:24    [17558754]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Gviber
Member

Откуда:
Сообщений: 124
- = -0 = 0
24 апр 15, 13:25    [17558771]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

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

а вот у оракла ход мысли более понятен. Выдает ошибку ORA- 01722. Invalid number. А MS SQL съедает.
Неужели ANSI SQL каждая СУБД по своему трактует

SELECT CAST('-' AS int) FROM DUAL
24 апр 15, 13:34    [17558844]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
Неужели ANSI SQL каждая СУБД по своему трактует

А где тут ANSI SQL ?
24 апр 15, 13:35    [17558852]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
а вот у оракла ход мысли более понятен. Выдает ошибку ORA- 01722. Invalid number. А MS SQL съедает.

Какой убогий Оракл. Не знает, что такое унарный минус
24 апр 15, 13:36    [17558860]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

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

тоже самое в оракле выдает пустую строку, а в MS SQL выдает нолик
А разве CAST не относится к SQL-92 ANSI

DECLARE
  i INT := NULL;
  p INT;
BEGIN
  SELECT NVL(i, '') INTO p FROM DUAL;
  dbms_output.put_line(p);
END;
24 апр 15, 13:44    [17558907]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
abort
тоже самое в оракле выдает пустую строку
пустую строку целого типа?
24 апр 15, 13:46    [17558918]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
А разве CAST не относится к SQL-92 ANSI

А что имя функции определяет принципы конвертирования типов данных ?

abort
тоже самое в оракле выдает пустую строку, а в MS SQL выдает нолик

Пустую строку типа integer ?
24 апр 15, 13:47    [17558928]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

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

не так выразился. В переменной p "сидит" null. На мой взгляд оракл более логичен и понятен и не проглатывает "противоречия"

DECLARE
  i INT := NULL;
  p INT;
BEGIN
  SELECT NVL(i, '') INTO p FROM DUAL;
  IF (p IS NULL) THEN
    dbms_output.put_line('null');
  ELSE
    dbms_output.put_line('not null');
  END IF;
END;
24 апр 15, 13:51    [17558961]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
На мой взгляд оракл более логичен и понятен и не проглатывает "противоречия"

Ну так используйте Оракл
24 апр 15, 13:52    [17558967]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
abort
тоже самое в оракле выдает пустую строку, а в MS SQL выдает нолик

Потому что оракле "пустой строки" не бывает в принципе.
Там это эквивалентно значению NULL.

А в остальных СУБД "пустая строка" бывает.
24 апр 15, 13:52    [17558969]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

Откуда:
Сообщений: 625
в википедии нашел что CAST ввели именно в этом году
https://ru.wikipedia.org/wiki/SQL-92
Всегда думал, что такие старые функции как CAST должны отрабатывать в разных СУБД одинаково
24 апр 15, 13:56    [17558991]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
abort,

вообще говоря, надо либо принять это поведение в том виде, как оно есть,
либо использовать что-то другое.
Ответ на вопрос "а почему так???" очень прост: потому что Microsoft так сделало и менять ни за что не будет.
24 апр 15, 13:56    [17558993]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
abort
в википедии нашел что CAST ввели именно в этом году
https://ru.wikipedia.org/wiki/SQL-92
Всегда думал, что такие старые функции как CAST должны отрабатывать в разных СУБД одинаково
Там же не описывается точный алгоритм "как именно должна работать функция CAST"?
А так-то конечно, она с таким именем везде есть.
24 апр 15, 13:58    [17558999]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
Всегда думал, что такие старые функции как CAST должны отрабатывать в разных СУБД одинаково

Нет. Стандарт SQL унифицирует синтаксис, а не результаты
24 апр 15, 13:58    [17559003]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
iap
abort
в википедии нашел что CAST ввели именно в этом году
https://ru.wikipedia.org/wiki/SQL-92
Всегда думал, что такие старые функции как CAST должны отрабатывать в разных СУБД одинаково
Там же не описывается точный алгоритм "как именно должна работать функция CAST"?
А так-то конечно, она с таким именем везде есть.
К тому же набор типов данных у Oracle и у Microsoft ну очень отличается.
24 апр 15, 13:58    [17559004]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

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

Сегодня для меня это стало новостью дня. Придется это принимать как есть.
24 апр 15, 14:06    [17559063]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
o-o
Guest
кстати о птичках
Gviber
- = -0 = 0

???

declare @a int = '-';
declare @b int = '+';
select STR(@a) as [STR(@a)], STR(@b)as [STR(@b)], 
       cast(@a as varbinary(10)) as [@a as varbinary(10)], 
       cast(@b as varbinary(10)) as [@b as varbinary(10)],
       case when @a = @b then '@a = @b' else '@a <> @b' end as [@a = @b?]

STR(@a) STR(@b) @a as varbinary(10) @b as varbinary(10) @a = @b?
0 0 0x00000000 0x00000000 @a = @b

declare @f1 float, @f2 float;
select @f1 = 0, @f2 = ROUND(-1E-7,2);
select STR(@f1) as [STR(@f1)], STR(@f2)as [STR(@f2)], 
       cast(@f1 as varbinary(10)) as [@f1 as varbinary(10)], 
       cast(@f2 as varbinary(10)) as [@f2 as varbinary(10)],
       case when @f1 = @f2 then '@f1 = @f2' else '@f1 <> @f2' end as [@f1 = @f2?]

STR(@f1) STR(@f2) @f1 as varbinary(10) @f2 as varbinary(10) @f1 = @f2?
0 -0 0x0000000000000000 0x8000000000000000 @f1 = @f2


для любителей 2000-ого:
STR(@f2) = 0 -- обычный неотрицательный ноль
24 апр 15, 14:09    [17559083]     Ответить | Цитировать Сообщить модератору
 Re: почему выдает 0  [new]
abort
Member

Откуда:
Сообщений: 625
и еще странное поведение
в оракле
select NULL || 'hello' from dual
выдаст hello
а в MS SQL
select NULL + 'hello'
выдаст NULL

при переносе проектов с одной СУБД на другую и обратно будут вылазить такие "страшилки" несовместимости
24 апр 15, 14:13    [17559116]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить