2016-04-22 6 views
1

日付に基づいてデータを取得する手順があります。SQLでヌルチェックを最適化する方法は?

ALTER PROCEDURE [dbo].[GetLatestTicketsByDate] 
    @Datemin datetime2, 
AS 
BEGIN 
    DECLARE @LatestTickets TABLE 
    (
     DomainId bigint, 
     SoldTickets bigint 
    ) 

    INSERT INTO @LatestTickets(DomainId,SoldTickets) 
     SELECT 
      DomainId, SoldTickets 
     FROM 
      DomainDetailDataHistory 
     WHERE 
      [Date] >= @Datemin 

    SELECT * FROM @LatestTickets 
END 

は今、私はそれに新規のparamaterを追加することによって、この手順は、よりスマートにしたいが、これのparamaterはオプションです。

私のコードは次のようになります。

ALTER PROCEDURE [dbo].[GetLatestTicketsByDate] 
     @Datemin datetime2, 
     @Id uniqueidentifier = NULL 
    AS 
    BEGIN 
     DECLARE @LatestTickets TABLE 
     (
      DomainId bigint, 
      SoldTickets bigint 
     ) 

     IF (@Id IS NULL) 
     BEGIN 
      INSERT INTO @LatestTickets(DomainId,SoldTickets) 
       SELECT DomainId, SoldTickets 
       FROM DomainDetailDataHistory 
       WHERE [Date] >= @Datemin 

      SELECT * FROM @LatestTickets 
     END 
     ELSE 
     BEGIN 
      INSERT INTO @LatestTickets(DomainId,SoldTickets) 
       SELECT DomainId, SoldTickets 
       FROM DomainDetailDataHistory 
       WHERE Id = @Id AND [Date] >= @Datemin 

      SELECT * FROM @LatestTickets 
    END 
END 

これは動作しますが、私はこのような構造を好きではないし、より良い方法があればと思いまして?

私はこの試みた:

INSERT INTO @LatestTickets(DomainId,SoldTickets) 
    SELECT DomainId, SoldTickets 
    FROM DomainDetailDataHistory 
    WHERE (@Id IS NOT NULL AND Id = @Id) AND [Date] >= @Datemin 

SELECT * FROM @LatestTickets 

をしかし、それは動作しませんでした。

答えて

4

使用@Id IS NULL OR Id = @Id

INSERT INTO @LatestTickets(DomainId,SoldTickets) 
SELECT DomainId, SoldTickets 
FROM DomainDetailDataHistory 
WHERE (@Id IS NULL OR Id = @Id) AND [Date] >= @Datemin 
+0

すごい...まあ、私は正しい軌道に乗りました。私はこの時間をどのくらいの時間を置いているか教えてくれません – ThunD3eR