web-dev-qa-db-ja.com

SQL Server:変数が空か、WHERE句のNULLかどうかを確認します

製品のリストを検索する場合、@SearchTypeパラメータはオプションです。 @SearchTypeが空またはNULLの場合、すべての製品を返す必要があり、WHERE句を使用しないでください。それ以外の場合、Equipmentを渡すと、代わりにそれを使用します。

ALTER PROCEDURE [dbo].[psProducts] 
    (@SearchType varchar(50))
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        P.[ProductId],
        P.[ProductName],
        P.[ProductPrice],
        P.[Type]
    FROM [Product] P
    -- if @Searchtype is not null then use the where clause
    WHERE p.[Type] = @SearchType
END
33
User970008

ただ使う

@searchTypeがnullの場合、「テーブル全体を返す」ことを意味する場合は、

WHERE p.[Type] = @SearchType OR @SearchType is NULL

@searchTypeが空の文字列である場合、「テーブル全体を返す」ことを意味し、

WHERE p.[Type] = @SearchType OR @SearchType = ''

@searchTypeがnullまたは空の文字列が「テーブル全体を返す」ことを意味する場合、

WHERE p.[Type] = @SearchType OR Coalesce(@SearchType,'') = ''
91
Phil

検索したくないときにパラメーターを渡したくない場合は、''NULLは同じものです。

ALTER PROCEDURE [dbo].[psProducts] 
(
  @SearchType varchar(50) = NULL
)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT P.[ProductId]
  ,P.[ProductName]
  ,P.[ProductPrice]
  ,P.[Type]
  FROM dbo.[Product] AS P
  WHERE p.[Type] = COALESCE(NULLIF(@SearchType, ''), p.[Type]);
END
GO

NULL、空の文字列('')、またはパラメータを省略すると、where句は本質的に無視されます。

14
Aaron Bertrand
WHERE p.[Type] = isnull(@SearchType, p.[Type])
5
RedFilter

動的クエリを使用できる場合は、LENを使用できます。空文字列とnull文字列の両方でfalseを返します。このようにして、オプションパラメータを実装できます。

ALTER PROCEDURE [dbo].[psProducts] 
(@SearchType varchar(50))
AS
BEGIN
    SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = N'
    SELECT 
        P.[ProductId],
        P.[ProductName],
        P.[ProductPrice],
        P.[Type]
    FROM [Product] P'
    -- if @Searchtype is not null then use the where clause
    SET @Query = CASE WHEN LEN(@SearchType) > 0 THEN @Query + ' WHERE p.[Type] = ' + ''''+ @SearchType + '''' ELSE @Query END   

    EXECUTE sp_executesql @Query
    PRINT @Query
END
0
Ali Umair

古い投稿ですが、私のようにつまずく人のために一見の価値があります

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NOT NULL

ISNULL(NULLIF(ColumnName, ' '), NULL) IS NULL
0
singhswat