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

Откуда:
Сообщений: 64
Добрый день.

Есть маленький вопросик. Такой запрос...

select
fa.ownerid Менеджер,
fa.new_regionname Регион,

(
select count(CRMAF_fa2.accountid)
from
FilteredAccount CRMAF_fa2
where
CRMAF_fa2.ownerid = CRMAF_fa.ownerid
and CRMAF_fa2.new_region = CRMAF_fa.new_region
),

from
FilteredAccount fa

В подзапросе сравнение CRMAF_fa2.new_region = CRMAF_fa.new_region возвращает False если оба поля равны NULL (и соответственно не увеличивает счетчик :) ). А мне нужно чтобы возврщало true :)
27 июл 09, 14:54    [7464563]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select
fa.ownerid Менеджер,
fa.new_regionname Регион,

(
select count(CRMAF_fa2.accountid)
from
FilteredAccount CRMAF_fa2
where
CRMAF_fa2.ownerid = CRMAF_fa.ownerid
and (CRMAF_fa2.new_region = CRMAF_fa.new_region or CRMAF_fa2.new_region is null or CRMAF_fa.new_region is null
)

для спящего время бодрствования равносильно сну
27 июл 09, 14:56    [7464573]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Алексей2003
select
fa.ownerid Менеджер,
fa.new_regionname Регион,

(
select count(CRMAF_fa2.accountid)
from
FilteredAccount CRMAF_fa2
where
CRMAF_fa2.ownerid = CRMAF_fa.ownerid
and (CRMAF_fa2.new_region = CRMAF_fa.new_region or CRMAF_fa2.new_region is null or CRMAF_fa.new_region is null
)

для спящего время бодрствования равносильно сну
Во-первых, скобки не хватает, а, во-вторых, насколько я понимаю, если CRMAF_fa2.new_region IS NULL, то и CRMAF_fa.new_region должен быть IS NULL?
27 июл 09, 15:02    [7464626]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
2iap
1. скобку забыл поставить.
2. если там 1 нул, то там и второй нул есть, а тут в любом случае белиберда получится, потому как перемножение множеств с большой долей вероятности.

для спящего время бодрствования равносильно сну
27 июл 09, 15:04    [7464646]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
oradan
Member

Откуда:
Сообщений: 72
А может так:
(
select count(CRMAF_fa2.accountid)
from
FilteredAccount CRMAF_fa2
where
CRMAF_fa2.ownerid = CRMAF_fa.ownerid
and (CRMAF_fa2.new_region = CRMAF_fa.new_region) or (CRMAF_fa2.new_region is null AND CRMAF_fa.new_region is null)
)
27 июл 09, 15:21    [7464762]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
oradan
А может так:
(
select count(CRMAF_fa2.accountid)
from
FilteredAccount CRMAF_fa2
where
CRMAF_fa2.ownerid = CRMAF_fa.ownerid
and (CRMAF_fa2.new_region = CRMAF_fa.new_region) or (CRMAF_fa2.new_region is null AND CRMAF_fa.new_region is null)
)
Что имеет бòльший приоритет - AND или OR?
У вас получается, что если оба поля IS NULL, то равенство CRMAF_fa2.ownerid=CRMAF_fa.ownerid не проверяется?
27 июл 09, 15:42    [7464923]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
select fa.ownerid Менеджер, fa.new_regionname, sum(1) cnt
 from FilteredAccount
 group by fa.ownerid, fa.new_regionname

для спящего время бодрствования равносильно сну
27 июл 09, 15:46    [7464953]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
oradan
Member

Откуда:
Сообщений: 72
select count(CRMAF_fa2.accountid)
from
FilteredAccount CRMAF_fa2
where
(
(CRMAF_fa2.ownerid = CRMAF_fa.ownerid)
AND
(
(CRMAF_fa2.new_region = CRMAF_fa.new_region)
OR
((CRMAF_fa2.new_region is null) AND (CRMAF_fa.new_region is null))
)
)
27 июл 09, 15:48    [7464963]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
san_d
Member

Откуда: Киев
Сообщений: 60
а SET ANSI_NULLS OFF не подойдет?
SET ANSI_NULLS OFF
GO
select case when null=null then 1 else 0 end

SET ANSI_NULLS ON
GO
select case when null=null then 1 else 0 end
         
----------- 
1

(1 row(s) affected)

            
----------- 
0

(1 row(s) affected)
27 июл 09, 19:09    [7466090]     Ответить | Цитировать Сообщить модератору
 Re: сравнение NULL'ов  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
san_d
а SET ANSI_NULLS OFF не подойдет?
SET ANSI_NULLS OFF
GO
select case when null=null then 1 else 0 end

SET ANSI_NULLS ON
GO
select case when null=null then 1 else 0 end
         
----------- 
1

(1 row(s) affected)

            
----------- 
0

(1 row(s) affected)
Нет. Это только для сравнения с NULL. При сравнении полей таблиц не работает.
27 июл 09, 19:22    [7466131]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить