使用Case语句为SQL Server 2008在哪里为列名分配NULL值

时间:2012-07-22 13:57:47

标签: sql-server sql-server-2008

我有一张桌子GrowDaysLocation。在此表中,可以有两条与DistrictIdRegionId

相关的记录

即;

  • RegionId=1DistrictId = NULL
  • RegionId=1DistrictId = 1

我的条件是,如果RegionId = 1 and DistrictId = 1的行不存在,则获取RegionId = 1 and DistrictId = NULL的行。

如何使用单个查询完成此操作?

以下是我尝试过的查询。

在这个查询中,我在Where子句和Use子查询中使用CASE来查找行的存在,但问题是当我从case返回NULL时它不会返回任何行。

=============================================== ===

SET ANSI_NULLS OFF

Select * From GrowDaysLocations 
Where DistrictId = 
( CASE WHEN (Select Count(*) From GrowDaysLocations 
                Where RegionId = '38D95A68-4A92-4D11-9A88-464CF1492880' AND DistrictId = 'F4B67A07-1BF7-42F5-9F19-77329A215D8B' AND 
                GrowDaysProfileId = '79F8BDBF-67D3-44A7-A790-1C10EE8B2AD0') > 0 THEN DistrictId
            ELSE 
                NULL
            END
)   
AND RegionId = '38D95A68-4A92-4D11-9A88-464CF1492880' AND GrowDaysProfileId = '79F8BDBF-67D3-44A7-A790-1C10EE8B2AD0'

===========================================

2 个答案:

答案 0 :(得分:1)

RANK功能可能会为您提供所需的结果:

SELECT RegionId, DistrictId, GrowDaysProfileId
FROM
    (SELECT RegionId
        ,DistrictId
        ,GrowDaysProfileId
        ,RANK() OVER(PARTITION BY RegionId, GrowDaysProfileId 
                     ORDER BY DistrictId DESC) AS rankVal
    From GrowDaysLocation) sub
WHERE rankVal = 1

此查询将为您提供一个结果集,其中每个不同的RegionIdGrowDaysProfileId都有一行。如果RegionId / GrowDaysProfileId组合在表格中有多行,则查询将根据DistrictId的值选择结果。将首先使用DistrictId值最高的行,最后使用DistrictIdNULL最低的行)。

答案 1 :(得分:0)

这是因为在评估条件时

WHERE ColumnName = NULL

所有行都被过滤掉,因为在检查相等性时,如果任何一方为NULL,则无论条件如何(see Data Manipulation Language section),该行都会立即被过滤掉。你必须使用

WHERE ColumnName IS NULL

在这种情况下,您可以使用

WHERE ISNULL(DistrictID, 'Empty') = ...

在case语句中使用'Empty'字符串而不是null。