2013-09-26 4 views
0

Я пытаюсь выбрать последний enddate за nr. В случае, если nr содержит enddate со значением NULL, это означает, что nr по-прежнему активен. Короче говоря, я не могу использовать MAX(enddate), потому что из 2013-09-25 и NULL он выбрал бы дату, тогда как мне нужно NULL.Массив содержит значение NULL

Я пробовал следующий запрос, хотя кажется, что NULL IN (enddate) не возвращает то, что я подозревал. А именно: «если массив содержит хотя бы одно значение NULL ...». Другими словами, NULL должен превышать MAX().

SELECT nr, 
CASE WHEN NULL IN (enddate) THEN NULL ELSE MAX(enddate) END 
FROM myTable 
GROUP BY nr 

Кто-нибудь знает, как заменить это выражение?

ответ

0

Вы можете использовать запрос ниже. Он возвращает NULL перед другими датами (при условии, что вы положили дату достаточно большим), а затем восстанавливает NULL.

SELECT nr, CASE d WHEN '20990101' THEN NULL ELSE d END d 
FROM (
    SELECT nr, 
    CASE MAX(ISNULL(enddate, '20990101') d 
    FROM myTable 
    GROUP BY nr 
) 

Я не мог проверить синтаксис, чтобы могли быть небольшие опечатки.

0

Вы можете использовать этот запрос. CTE вычисляет максимальную дату, игнорируя любые значения NULL, после чего она возвращается в таблицу, чтобы увидеть, есть ли нулевое значение для каждого значения nr. Оператор case возвращает null, если он существует, или максимальная дата из CTE.

WITH CTE1 AS 
(SELECT nr, MAX(enddate) MaxEnddate 
FROM myTable 
GROUP BY nr) 
    SELECT CTE1.nr, 
    CASE WHEN MyTable.enddate IS NULL AND MyTable.NR IS NOT NULL THEN NULL ELSE CTE1.MaxEndDate END AS EndDate 
    FROM CTE1 
    LEFT JOIN MyTable 
    ON MyTable.nr=CTE1.nr 
    AND MyTable.enddate IS NULL 
0

Просто построить от @Szymon ответить немного:

drop table #temp 
create table #temp (MyDate date) insert into #temp (MyDate) values ('1/1/2010'),('1/1/2011'),('1/1/2012'),(NULL) 
select * from #temp 

SELECT 
    (CASE WHEN MAX(ISNULL(MyDate, '2099-01-01')) = '2099-01-01' THEN NULL ELSE MAX(ISNULL(MyDate, '2099-01-01')) END) as Max_Date 
FROM  
    #temp 

Запрос заменяет значение NULL с '2099-01-01'. Затем он смотрит, соответствует ли Макс равным «2099-01-01», и если да, возвращает NULL и в противном случае возвращает фактический Макс.

Смежные вопросы