1

私はテーブルを持っていますGrowDaysLocation。この表には、DistrictIdおよびに関する2つのレコードがあります。RegionId

すなわち;

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

の行が存在しない場合はRegionId = 1 and DistrictId = 1、の行を取得するという条件がありRegionId = 1 and DistrictId = NULLます。

単一のクエリを使用してこれをどのように達成できますか?

以下は私が試したクエリです。

このクエリでは、Where句で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このクエリは、個別のとごとに1行の結果セットを提供しますGrowDaysProfileIdRegionId/の組み合わせのテーブルに複数の行がある場合GrowDaysProfileId、クエリはの値に基づいて結果を選択しますDistrictId。値が最も高い行がDistrictId最初に使用され、値が最も低いDistrictIdNULL最も低い)行が最後に使用されます。

于 2012-07-22T14:34:15.100 に答える
0

これは、状態を評価するときに

WHERE ColumnName = NULL

等しいかどうかをチェックするときに、いずれかの側がNULLの場合、条件に関係なく行がすぐに除外されるため、すべての行が除外されます(データ操作言語のセクションを参照)。あなたは使用する必要があります

WHERE ColumnName IS NULL

この場合、あなたは使用することができます

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

また、caseステートメントではnullの代わりに「Empty」文字列を使用します。

于 2012-07-22T14:23:30.023 に答える