SQL检查NULL和增量

时间:2009-07-20 16:59:55

标签: sql null increment

我想检查是否有任何东西要返回给定要检查的号码,如果该查询没有返回任何条目,请增加该号码,直到达到条目并显示该条目。目前,代码如下所示:

        SELECT * 
    FROM news
    WHERE DATEDIFF(day, date, getdate() ) <= #url.d#
    ORDER BY date desc

其中#url.d#是传递的整数(比方说31)。如果没有返回结果,我想将#url.d#中存储的数字增加1,直到找到一个条目。

4 个答案:

答案 0 :(得分:3)

这种增量查询效率不高。通过说 - “我将永远不需要超过100个结果,所以给我这些”:

,你会得到更好的结果
SELECT top 100 *
FROM news
ORDER BY date desc

如果您只想要特定日期的项目(例如具有共同日期的项目作为结果中的第一项),则在客户端进一步过滤。

或者,您可以将多个查询请求转换为两个查询请求:

DECLARE
  @theDate datetime,
  @theDate2 datetime

SET @theDate = (SELECT Max(date) FROM news)
  --trim the time off of @theDate
SET @theDate = DateAdd(dd, DateDiff(dd, 0, @theDate), 0)
SET @theDate2 = DateAdd(dd, 1, @theDate)

SELECT *
FROM news
WHERE @theDate <= date AND date < @theDate2
ORDER BY date desc

答案 1 :(得分:0)

MySQL

SELECT  news.*,
        (
        SELECT  COUNT(*)
        FROM    news
        WHERE   date < DATEADD(day, GETDATE(), -#url.d#)
        )
FROM    news
WHERE   date >= DATEADD(day, GETDATE(), -#url.d#)
ORDER BY
        date DESC
LIMIT 1

SQL Server

SELECT  TOP 1
        news.*,
        (
        SELECT  COUNT(*)
        FROM    news
        WHERE   date < DATEADD(day, GETDATE(), -#url.d#)
        )
FROM    news
WHERE   date >= DATEADD(day, GETDATE(), -#url.d#)
ORDER BY
        date DESC

请注意,使用此语法会使您的查询 sargable ,这是一个索引可用于有效地过滤date

答案 2 :(得分:0)

首先,我想您可能希望在where子句中使用DateDiff函数,而是计算所需的截止日期,并在where子句中的date列上使用任何计算,这样会更有效,所以而不是

WHERE DATEDIFF(day, date, getdate() ) <= #url.d#

你会有像

这样的东西
WHERE date >= @cutoffDate

其中@cutoffDate是基于#url.d#

的计算日期

现在,至于抓住正确的截止日期。我的假设是,在正常情况下,会有从请求中返回的文章,否则您只需从最近的日期获取文章。因此,我将采取的方法是获取计算截止日期的OLDEST(基于#url.d#和最近的文章日期。类似

-- @urld == #url.d
-- compute the cutoff date as the OLDEST of the most recent article and
-- the date based on #url.d
declare @cutoff datetime
select @cutoff =  DateAdd(dd,-1*@urld,GetDate())
select @cutoff


select @cutoff = min(cutoffDate)
from 
(SELECT Max(date) as cutoffDate from News
UNION
select @cutoff) Cutoff


-- grab the articles with dates that are more recent than the cutoff date
select *
from News
WHERE date >= @cutoff

我也猜测你可能想要在午夜时分(我没有在这里做)。这是一种多查询方法,应该可以在单个存储过程中实现...如果这是您正在寻找的。

祝你好运!

答案 3 :(得分:0)

如果你想要一行:

SELECT t.*
  FROM NEWS t
 WHERE t.id = (SELECT MAX(n.id)
                 FROM NEWS n
                WHERE n.date BETWEEN DATEADD(day, -:url.d, getDate()) AND getDate())

DATEADD使用否定版可能并不是很明显,以便返回所需的天数。

如果您想要该日期中的所有行:

SELECT t.*
  FROM NEWS t
 WHERE t.date BETWEEN DATEADD(day, -:url.d, getDate()) AND getDate())