Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Есть ли разница между coalesce и isnull если аргументов только два?  [new]
Albert Gor
Member

Откуда: Москва
Сообщений: 250
Если разница существует, то которую из функций предпочтительнее использовать и почему?
31 май 11, 09:41    [10736506]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2793
Я всегда использую coalesce потому что:
- она описана в SQL-92 (isnull() - чисто microsoft'овское изобретение);
- в эту функцию можно подставить более двух параметров.
31 май 11, 09:46    [10736530]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
COALESCE (Transact-SQL)
Типы возвращаемых данных
Возвращает тип данных аргумента в выражении expression с наиболее высоким приоритетом. Если ни одно из выражений не допускает значения NULL, то результат типизируется как не допускающий значения NULL.
Замечания
Поведение функций ISNULL и COALESCE может быть различным, несмотря на их равнозначность. Выражение, содержащее ISNULL с параметрами, отличными от NULL, считается NOT NULL, в то время как выражения, содержащие COALESCE с параметрами, отличными от NULL, рассматриваются как NULL.
Функция ISNULL (Transact-SQL)
Типы возвращаемых данных
Возвращает тот же тип, что и у аргумента check_expression.
31 май 11, 10:00    [10736566]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
COALESCE (Transact-SQL)
Типы возвращаемых данных
Возвращает тип данных аргумента в выражении expression с наиболее высоким приоритетом. Если ни одно из выражений не допускает значения NULL, то результат типизируется как не допускающий значения NULL.
Замечания
Поведение функций ISNULL и COALESCE может быть различным, несмотря на их равнозначность. Выражение, содержащее ISNULL с параметрами, отличными от NULL, считается NOT NULL, в то время как выражения, содержащие COALESCE с параметрами, отличными от NULL, рассматриваются как NULL.
Функция ISNULL (Transact-SQL)
Типы возвращаемых данных
Возвращает тот же тип, что и у аргумента check_expression.
Между прочим, я, как ни вчитываюсь, не могу понять смысл замечания BOL по поводу различия поведения ISNULL и COALESCE.
31 май 11, 10:07    [10736600]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Между прочим, я, как ни вчитываюсь, не могу понять смысл замечания BOL по поводу различия поведения ISNULL и COALESCE.

create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
go
drop table t
ну, и при select ... into ... так же будет.

Posted via ActualForum NNTP Server 1.4

31 май 11, 10:22    [10736701]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
daw
> Между прочим, я, как ни вчитываюсь, не могу понять смысл замечания BOL по поводу различия поведения ISNULL и COALESCE.

create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
go
drop table t
ну, и при select ... into ... так же будет.
Спасибо!
Но в тексте говорится про "выражения, содержащие ISNULL() или COALESCE()".
В моём понимании это нечто большее. Получается абсурдный результат:
create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as null+coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
INSERT t(c) VALUES(0)
SELECT *  FROM t
go
drop table t
Правда же?
31 май 11, 10:30    [10736770]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
daw
> Между прочим, я, как ни вчитываюсь, не могу понять смысл замечания BOL по поводу различия поведения ISNULL и COALESCE.

create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
go
drop table t
ну, и при select ... into ... так же будет.
Спасибо!
Но в тексте говорится про "выражения, содержащие ISNULL() или COALESCE()".
В моём понимании это нечто большее. Получается абсурдный результат:
create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as null+coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
INSERT t(c) VALUES(0)
SELECT *  FROM t
go
drop table t
Правда же?
Что-то я ступил! Хотел так:
create table t (c int null, c_isnull as null+isnull(c, 777), c_coalesce as coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
go
drop table t
И выражение, содержащее ISNULL() с аргументами NOT NULL считается NULLABLE
31 май 11, 10:38    [10736817]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
daw
> Между прочим, я, как ни вчитываюсь, не могу понять смысл замечания BOL по поводу различия поведения ISNULL и COALESCE.

create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
go
drop table t
ну, и при select ... into ... так же будет.
Спасибо!
Но в тексте говорится про "выражения, содержащие ISNULL() или COALESCE()".
В моём понимании это нечто большее. Получается абсурдный результат:
create table t (c int null, c_isnull as isnull(c, 777), c_coalesce as null+coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
INSERT t(c) VALUES(0)
SELECT *  FROM t
go
drop table t
Правда же?
Что-то я ступил! Хотел так:
create table t (c int null, c_isnull as null+isnull(c, 777), c_coalesce as coalesce(c, 777))
select name, is_nullable from sys.columns where object_id = object_id('t')
go
drop table t
И выражение, содержащее ISNULL() с аргументами NOT NULL считается NULLABLE
31 май 11, 10:38    [10736818]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В моём понимании это нечто большее.

ну эта... однозначно говорить о нуллабельности или не нуллабельности чего-то более сложного
просто нет смысла - мало ли что там еще содержится.
а оригинальное involve (involving), вроде как, можно переводить и как "представлять собой; быть, являться".
http://www.multitran.ru/c/m.exe?CL=1&s=involving&l1=1

Posted via ActualForum NNTP Server 1.4

31 май 11, 10:44    [10736834]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
daw
> В моём понимании это нечто большее.

ну эта... однозначно говорить о нуллабельности или не нуллабельности чего-то более сложного
просто нет смысла - мало ли что там еще содержится.
а оригинальное involve (involving), вроде как, можно переводить и как "представлять собой; быть, являться".
http://www.multitran.ru/c/m.exe?CL=1&s=involving&l1=1
Если бы написали "выражение, состоящее из ISNULL с параметрами IS NOT NULL рассматривается как NOT NULLABLE",
то придраться было бы не к чему.
"Состоящее из" вместо "содержащее"

И в английской версии то же самое. (Сейчас там "involving")
31 май 11, 10:50    [10736858]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 659
iap, daw

Моя старенькая линво 6.0 дает еще такой перевод
автор
involve
1) включать в себя
2) включать себя
3) влечь
4) вовлекать
5) возводить в степень
6) обвертывать
7) окутывать

8) участвовать

Тогда токой перевод больше отражает действительность
автор
в то время как выражения, обернутые в COALESCE с параметрами, отличными от NULL, рассматриваются как NULL
31 май 11, 11:26    [10737178]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
iap, вообще не могу понять как можно подумать что что-то частное определяет свойства общему. (Может влиять, но не определять)
Естественно, что функция может только за себя отвечать в зависимости от её параметров, но не за выражение же в котором она прописана.

Может я не понял суть ваших "пепоняток"?
Или вы и имели ввиду что перевод плохой?
31 май 11, 11:40    [10737331]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mnior
Или вы и имели ввиду что перевод плохой?
Нет. Перевод правильный
Путанное какое-то оригинальное (англ.) замечание в BOL.
31 май 11, 11:44    [10737383]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Guf
автор
в то время как выражения, обернутые в COALESCE с параметрами, отличными от NULL, рассматриваются как NULL
Всё равно же expression - подлежащее. Нигде нет passive.
Так кто же кого?
Не "обернутые", а "оборачивающие" тогда уж... И в единственном числе, если быть точным.
An expression involving ISNULL with non-null parameters is considered to be NOT NULL,
while expressions involving COALESCE with non-null parameters is considered to be NULL.
31 май 11, 11:50    [10737427]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли разница между coalesce и isnull если аргументов только два?  [new]
Валдай
Member

Откуда:
Сообщений: 113
Вообще в плане запроса они разные.
Дэ-факто COALESCE преобразуется в CASE.
по моим наблюдениям isnull побыстрее работает.
SQL 2008
select *, A=ISNULL(v1,v2)
from @t

StmtText
-----------------------------------------------------------
|--Compute Scalar(DEFINE:([Expr1003]=isnull([v1],[v2])))
|--Clustered Index Scan(OBJECT:(@t))

StmtText
----------------------------------------

select *, A=COALESCE(v1,v2)
from @t

StmtText
--------------------------------------------------------------------------------------------
|--Compute Scalar(DEFINE:([Expr1003]=CASE WHEN [v1] IS NOT NULL THEN [v1] ELSE [v2] END))
|--Clustered Index Scan(OBJECT:(@t))
31 май 11, 13:12    [10738191]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить