4

WHEREでCASEを使用したいので、countryIdが-1の場合は何も選択せず、それ以外の場合は値を選択します。これが私の機能しないコードです

 DECLARE @countryId int=-1 --for example
   SELECT * FROM dbo.bbmf WHERE status=1 
 AND countryId =
CASE WHEN @countryId = -1 THEN 
 --select any
ELSE
 countryId=@countryId
END

ご協力いただきありがとうございます

4

6 に答える 6

2

あなたの質問は明確ではないので、私はあなたが達成したいと思うかもしれない2つの結果を見ます。

最初はにのみ依存しcountryIDます。したがって、countryIDが-1の場合は、レコードを選択しないでください。

-1がないcountryId場合は、この簡単な選択を使用できます。これは、の場合は@countryID = -1(ANDのため)何も返さず、-1でない場合は、必要なレコードが返されるためです。

SELECT * 
FROM dbo.bbmf 
WHERE status=1 
  AND (countryId=@countryId)

(最初のソリューションに加えて、id = -1の国がある場合は、AND (countryId=@countryId)Toを変更する必要がありますAND (countryId=@countryId AND @countryId <> -1)

2つ目は、の場合countryId = -1、ステータスを確認するだけで、すべてのレコードをで取得する必要がある場合は、次のstatus = 1ステートメントを使用する必要があります。

SELECT * 
FROM dbo.bbmf 
WHERE status=1 
  AND (countryId = -1 
     OR countryId = @countryId)
于 2012-09-15T09:23:42.243 に答える
2

私はこのようにこれらが好きです:

DECLARE @countryId int=-1 

SELECT * 
FROM dbo.bbmf 
WHERE 
    status=1 
    AND 
    1 = CASE 
        WHEN @countryId = -1 THEN 0
        WHEN countryId=@countryId THEN 1
        ELSE 0 --<<probably don't need the ELSE
    END
于 2012-09-15T13:23:32.210 に答える
1

国IDが-1であるかどうかに関係なく、ステートメントを実行しSELECTます。これは冗長な呼び出しです。CountryIdが-1に等しくない場合にSELECTステートメントを実行するだけの場合は、WHERE句でフィルターで除外するか、:を使用しConditionalます。

フィルタリング:

SELECT * FROM dbo.bbmf 
WHERE status=1 AND countryId != -1

条件付きの使用:

IF (@countryId != -1)  
BEGIN
    -- SELECT STATEMENT HERE
END 
于 2012-09-15T09:25:39.890 に答える
1

デモをお試しください

SELECT * FROM dbo.bbmf 
WHERE status=1 
AND countryId = @CountryID
AND @countryId <> -1
于 2012-09-15T09:26:56.440 に答える
0
SELECT * FROM dbo.bbmf 
WHERE status=1 
AND countryId <> -1
于 2012-09-15T09:34:43.113 に答える
0

コードのユースケースが見つかりませんが、次のような不可能なwhere句を使用してselectを実行できる可能性があります。

SELECT * FROM dbo.bbmf WHERE status = 1 AND 1> 2

ただし、一部の人が言うように、結果が必要ない場合は、クエリを実行しないでください。

于 2012-09-15T09:36:27.857 に答える