更好的条件列查询方法

时间:2018-03-05 08:04:04

标签: sql-server sql-server-2008-r2

--OldQuery
SELECT oldStartDate AS column,...
FROM Table
WHERE
oldStartDate > @date,...
GROUP BY
oldStartDate,...

表中添加了一个新的列newStartDate可空,并且数据提取必须有条件地依赖于此列

--NewQuery
SELECT ISNULL(newStartDate, oldStartDate) AS column,...
FROM Table
WHERE
(    
    (newStartDate IS NULL AND oldStartDate > @date)
    OR 
    (newStartDate > @date)
),...
GROUP BY
ISNULL(newStartDate, oldStartDate),...

以上是我可以想到的有条件检索的方法但是在我看来会导致性能问题而我无法在DEV环境中进行评估,因为体积不够大但生产估计约为2mil记录。想知道是否有其他推荐的方法呢?

1 个答案:

答案 0 :(得分:1)

如果您要在ISNULL子句中使用GROUP BY,您也可以在WHERE子句中使用,因为两者都会使newStartDate无法使用,because the column is nullable.(感谢您的链接,John Cappelletti!)

假设NewStartDate将替换OldStartDate,您可以做的一件事就是将newStartDate中的所有空值更新为oldStartDate的非空值,然后将您的newStartDate列更改为不可为空的列:

UPDATE TableName
SET NewStartDate = OldStartDate
WHERE NewStartDate IS NULL;
GO

ALTER TABLE TableName
    ALTER COLUMN NewStartDate date NOT NULL;
GO

然后您的查询可以更加简单和易于理解:

SELECT NewStartDate AS column,...
FROM Table
WHERE
NewStartDate > @date,...
GROUP BY
NewStartDate ,...