2013-10-28 47 views
0

我与查询工作:不选择行,如果它是空的

SELECT DISTINCT PointPerson 
FROM DailyTaskHours 
WHERE ActivityDate BETWEEN @startDateParam 
     AND @endDateParam 
GROUP BY PointPerson 
HAVING SUM([Hours]) > 0 
ORDER BY PointPerson 

这是它返回:

enter image description here

正如你可以看到返回的第一个值是一个空字符串。如何防止在查询中返回此行。如果空不要回归..

+0

你可以正常化你的表;) – woz

+0

他们不是我的表= P –

回答

2

你只是在你的WHERE条款添加一个条件

SELECT DISTINCT PointPerson 
FROM DailyTaskHours 
WHERE ActivityDate BETWEEN @startDateParam AND @endDateParam 
    AND PointPerson <> '' 
GROUP BY PointPerson 
HAVING SUM([Hours]) > 0 
ORDER BY PointPerson 

有很多这种情况的变化,这取决于你的表是如何规范化。

如果你确信你将永远有一个空格,那么你可以使用:

AND PointPerson <> ''

如果能够有一个NULL值时,它的最明智的做法是使用方法:

AND ISNULL(PointPerson, '') <> ''

如果有可能在这一领域的空间(他们将冲击片雷管为空白,但仍然不被第一个选项被抓),哟ü可以用组合一起使用的附加条件与前两种,它提供了最安全的选择(覆盖大多数情况下):

AND ISNULL(PointPerson, '') <> '' 
AND LEN(LTRIM(PointPerson)) > 0 

的条件这一组合将帮助你避免NULL值,和多个空格它们是将通过修剪LTRIM来消除,其结果必须至少有一个字符。

+0

您可以用'len',而不是同时使用' <>''''和'null' :) –

+0

@huMptyduMpty是的,但是如果他有空格呢?那些LEN> 0,但不应该显示。 –

+0

是的,我已经在我的回答中回答了! –

1

而且考虑空值(如果需要)

SELECT DISTINCT PointPerson 
FROM DailyTaskHours 
WHERE ActivityDate BETWEEN @startDateParam 
     AND @endDateParam 
    AND isnull(PointPersonm,'') <> '' 
GROUP BY PointPerson 
HAVING SUM([Hours]) > 0 
ORDER BY PointPerson 
1
SELECT DISTINCT PointPerson 
FROM DailyTaskHours 
WHERE ActivityDate BETWEEN @startDateParam 
     AND @endDateParam 
     AND len(ltrim(rtrim(PointPerson)))>0 
GROUP BY PointPerson 
HAVING SUM([Hours]) > 0 
ORDER BY PointPerson 
相关问题