1

という列を持つMS SQL 2008のテーブルがありますStatus。値として "A" または "I" または "P" を持つことができます。パラメータとして受け取るストアドプロシージャがあり@Statusます。パラメータが の場合null、ステータスが A または I または P のいずれかであるすべてのレコードを取得する必要があります (基本的に [ステータス] フィールドは無視します)。パラメータが A のみの場合 (たとえば)、ステータスが A のレコードのみを取得する必要があります。なしで単一の SELECT ステートメントでこれを行うにはどうすればよいIF.. ELSEですか?

 -- This is just a snippet of a larger query. 
 -- Can the following be done without IF ELSE?
    IF @Status = NULL
       BEGIN
         SELECT * FROM Person
       END
    ELSE SELECT * FROM Person WHERE Status = @Status

編集: 私の目標は、同じロジックを 2 回複製することではありません。select ステートメントには多数の結合などがあり、else 条件でもう一度繰り返したくありません。

編集 #2: 悪い - テーブルをもう一度確認したところ、NULLステータスのレコードが含まれていますが、これは望ましくありません。ここにテーブルがあります -

Id      Status
--------------
1        A
2        I
3        P
4        NULL

が「-1」の場合@Status(パラメーターをデフォルトで -1 に設定します)、1, 2, 3レコードが必要です。クエリの書き方

4

5 に答える 5

1

ORを使用してそれを行うことができます:

SELECT * FROM Person WHERE Status = @Status OR @Status IS NULL

またはUNIONALL:

SELECT * FROM Person WHERE Status = @Status
UNION ALL
SELECT * FROM Person WHERE @Status IS NULL
于 2012-04-25T19:03:54.273 に答える
1

3 番目のオプション:

SELECT * FROM dbo.Person WHERE Status = COALESCE(@Status, Status);

または、ISNULL を好むかもしれません:

SELECT * FROM dbo.Person WHERE Status = ISNULL(@Status, Status);

完全を期すために、ここでの選択性がそれを正当化する可能性はほとんどありませんが、 @Status IS NULL と @Status IS NOT NULL のプランが大きく異なり、いずれかでプランをキャッシュするとパフォーマンスが低下する可能性があることに気付くかもしれません。逆の場合。これに対処する 1 つの方法は、動的 SQL です。繰り返しになりますが、これはおそらくあなたのケースでは適切なオプションであるという免責事項がありますが、これは、これらの計画固定 COALESCE/ISNULL/OR オプションの一般的に使用される代替手段です。

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'SELECT * FROM dbo.Person' + 
  COALESCE(N' WHERE Status = ''' + CONVERT(VARCHAR(12), @Status) + '''', '');

PRINT @sql;
--EXEC sp_executesql @sql;

そしてもちろん、運用コードで SELECT * を使用してはならないことはわかっていますよね?

于 2012-04-25T19:06:31.713 に答える
0

これはそれを行う必要があります:

select * from Person
where (@Status is not null and Status = @Status) or
      (@Status is null and Status in ('A', 'I', 'P')) 
于 2012-04-25T19:38:00.863 に答える
0
declare @status CHAR(1)
set @status = 'A'
select * from Person where (@status IS null) or (@status = status)

@status = NULL の場合、このクエリはすべてのレコードを返します。

于 2012-04-25T19:22:03.460 に答える
0
SELECT * FROM Person WHERE @Status IS NULL OR Status = @Status
于 2012-04-25T19:04:54.763 に答える