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

Откуда: Москва
Сообщений: 509
Есть 2 переменные @bdat1 и @bdat. Обе могут принимать значение Null
Как их сравнить на неравенство?
При простом сравнении
if @bdat1!=@bdat

При любом Null результат не определен.
Везде прописывать еще и проверку isnull?
12 мар 12, 12:56    [12230855]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
asdor
Везде прописывать еще и проверку isnull?

да, либо:
set ansi_nulls off
12 мар 12, 12:58    [12230873]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
IF @bdat1<>@bdat OR @bdat1 IS NULL AND @bdat IS NOT NULL OR @bdat1 IS NOT NULL AND @bdat IS NULL
IF NOT EXISTS(SELECT @bdat1 INTERSECT SELECT @bdat)
12 мар 12, 12:59    [12230877]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Knyazev Alexey
asdor
Везде прописывать еще и проверку isnull?

да, либо:
set ansi_nulls off
А эта штука в SQL2012 ещё работает?
12 мар 12, 13:00    [12230890]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
IF @bdat1<>@bdat OR @bdat1 IS NULL AND @bdat IS NOT NULL OR @bdat1 IS NOT NULL AND @bdat IS NULL
IF NOT EXISTS(SELECT @bdat1 INTERSECT SELECT @bdat)
IF EXISTS(SELECT @bdat1 EXCEPT SELECT @bdat)
Но если сравниваются поля, по которым есть индекс, лучше INTERSECT
12 мар 12, 13:02    [12230899]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
iap
Knyazev Alexey
пропущено...

да, либо:
set ansi_nulls off
А эта штука в SQL2012 ещё работает?

да :)
и
ansi_padding off
quoted_identifier off


хотя всё грозятся убрать
12 мар 12, 13:02    [12230905]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А вот ещё экзотика:
IF (SELECT COUNT(*) FROM (SELECT @bdat1 UNION SELECT @bdat)T(F))=2
Но тормозить будет
12 мар 12, 13:07    [12230936]     Ответить | Цитировать Сообщить модератору
 Re: Сравнить 2 переменные  [new]
tunknown
Member

Откуда:
Сообщений: 776
asdor
Как их сравнить на неравенство?


declare	@c1	nvarchar(256)
	,@c2	char(16)
	,@dt1	smalldatetime
	,@dt2	datetime
select	@c1=	'20010101'
	,@c2=	'20010101'
	,@dt1=	'20010101'
	,@dt2=	'20010101'
select	nullif(checksum(@c1),checksum(@c2)),nullif(checksum(@dt1),checksum(@dt2))


такой метод работает:
  • почти быстрее прочих, т.к. нет дополнительных условий or/and, которые может неправильно понять оптимизатор
  • почти универсально, т.к. с datetime/smalldatetime не работает
  • 15 мар 12, 15:10    [12253941]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9827
    tunknown
    почти быстрее прочих, т.к. нет дополнительных условий or/and, которые может неправильно понять оптимизатор
    Можете привести пример такого поведения оптимизатора?
    tunknown
    почти универсально, т.к. с datetime/smalldatetime не работает
    Вы в курсе, что checksum может быть одинаков для разных значений?
    15 мар 12, 15:48    [12254451]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    iljy
    Member

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

    плохой метод. Быстрее прочих он работать будет сильно врядли, а вот возможность использования индексов он убивает напрочь.
    15 мар 12, 15:50    [12254463]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 776
    invm
    Можете привести пример такого поведения оптимизатора?

    Навскидку- нет
    invm
    Вы в курсе, что checksum может быть одинаков для разных значений?

    Естественно, хотя можно предположить, что вероятность этого пропорциональна длине аргументов checksum
    iljy
    плохой метод.

    Кто говорил, что хороший? Написано- почти универсальный :-)
    iljy
    возможность использования индексов он убивает напрочь.

    Не обязательно
    15 мар 12, 16:43    [12255157]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9827
    tunknown
    invm
    Вы в курсе, что checksum может быть одинаков для разных значений?

    Естественно, хотя можно предположить, что вероятность этого пропорциональна длине аргументов checksum
    Т.е. вы считаете нормальным, что система, использующая предложенный способ, пусть с небольшой вероятностью, но может работать с ошибками?
    15 мар 12, 17:08    [12255484]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    iljy
    Member

    Откуда:
    Сообщений: 8711
    tunknown
    iljy
    возможность использования индексов он убивает напрочь.

    Не обязательно

    Даа? Интересно, в какой ситуации оптимизатор сможет корректно использовать индекс при таких условиях на индексированные поля?
    15 мар 12, 17:29    [12255707]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 776
    invm
    Т.е. вы считаете нормальным, что система, использующая предложенный способ, пусть с небольшой вероятностью, но может работать с ошибками?
    ответ есть в
    BOL
    unless your application can tolerate occasionally missing a change
    15 мар 12, 18:01    [12255969]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    invm
    Member

    Откуда: Москва
    Сообщений: 9827
    tunknown
    invm
    Т.е. вы считаете нормальным, что система, использующая предложенный способ, пусть с небольшой вероятностью, но может работать с ошибками?
    ответ есть в
    BOL
    unless your application can tolerate occasionally missing a change
    Но вы же предлагаете метод, претендующий на универсальность. Или считаете, что приложение всегда должно быть "tolerate occasionally missing a change"?
    В общем, если любите извращения, то сии извращения должны быть хотя бы работоспособны. Например так:
    declare	@c1	nvarchar(256)
    	,@c2	char(16)
    	,@dt1	smalldatetime
    	,@dt2	datetime
    select	@c1=	'20010101'
    	,@c2=	'20010101'
    	,@dt1=	'20010101'
    	,@dt2=	'20010101'
    select	(select @c1 except select @c2), (select @dt1 except select @dt2)
    
    15 мар 12, 18:13    [12256041]     Ответить | Цитировать Сообщить модератору
     Re: Сравнить 2 переменные  [new]
    Lisichkin
    Member

    Откуда:
    Сообщений: 485
    Серега! Посмотри почту!
    20 мар 12, 12:23    [12280046]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить