1

我有一张桌子GrowDaysLocation。在这个表中,可以有两条关于DistrictId和的记录RegionId

IE;

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

我有一个条件,如果该行不存在,RegionId = 1 and DistrictId = 1则获取RegionId = 1 and DistrictId = NULL.

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

以下是我尝试过的查询。

在这个查询中,我在 Where 子句中使用了 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'

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

4

2 回答 2

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

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

于 2012-07-22T14:34:15.100 回答
0

这是因为在评估条件时

WHERE ColumnName = NULL

所有行都被过滤掉,因为在检查相等性时,如果任何一侧为 NULL,则无论条件如何,都会立即过滤掉该行(请参阅数据操作语言部分)。你必须使用

WHERE ColumnName IS NULL

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

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

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

于 2012-07-22T14:23:30.023 回答