我有一张桌子GrowDaysLocation
。在此表中,可以有两条与DistrictId
和RegionId
即;
RegionId=1
和DistrictId = NULL
RegionId=1
和DistrictId = 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'
===========================================
答案 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
此查询将为您提供一个结果集,其中每个不同的RegionId
和GrowDaysProfileId
都有一行。如果RegionId
/ GrowDaysProfileId
组合在表格中有多行,则查询将根据DistrictId
的值选择结果。将首先使用DistrictId
值最高的行,最后使用DistrictId
(NULL
最低的行)。
答案 1 :(得分:0)
这是因为在评估条件时
WHERE ColumnName = NULL
所有行都被过滤掉,因为在检查相等性时,如果任何一方为NULL,则无论条件如何(see Data Manipulation Language section),该行都会立即被过滤掉。你必须使用
WHERE ColumnName IS NULL
在这种情况下,您可以使用
WHERE ISNULL(DistrictID, 'Empty') = ...
在case语句中使用'Empty'字符串而不是null。