数组包含NULL值

时间:2013-09-26 10:22:48

标签: sql sql-server arrays null expression

我正在尝试按enddate选择最后nr。如果nr包含值enddate的{​​{1}},则表示此NULL仍处于活动状态。简而言之,我无法使用nr,因为在MAX(enddate)2013-09-25之外,它会选择日期,而我需要NULL

我尝试了以下查询,但似乎NULL没有返回我怀疑的内容。即:'如果数组包含至少一个值NULL IN (enddate) ...'。换句话说,NULL应该超过NULL

MAX()

有人知道如何替换这个表达式吗?

3 个答案:

答案 0 :(得分: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
)

我无法检查语法,因此可能存在小错字。

答案 1 :(得分:0)

您可以使用此查询。 CTE计算忽略任何空值的最大日期,然后将其连接回表以查看每个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

答案 2 :(得分: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

查询使用' 2099-01-01'替换NULL值。然后,它会查看Max是否等于' 2099-01-01'如果是,则返回NULL,否则返回实际的Max。