SQL Server查询过滤器查询-NULL参数

时间:2018-10-02 16:07:53

标签: sql-server

SQL Server数据库问题。

表架构:

X

数据:

<div
  ng-repeat="item in eventList"
  customEventName="{{item.title}}">
  {{item.title}}
</div>

我正在运行一个SQL查询,该查询应该检索与CREATE TABLE [dbo].[TestTable] ( [ID] [INT] NOT NULL, [PhaseID] [INT] NULL ) ON [PRIMARY] 列完全匹配的记录(它可以为null或整数)。但是似乎缺少某些内容。

INSERT INTO TestTable 
VALUES (1, NULL), (2, 1), (3, 2), (4, NULL)

如果PhaseId参数为整数,则可以正常工作。

DECLARE @ID INT, @PhaseID INT

SET @ID = 1
SET @PhaseID = 1

SELECT * 
FROM TestTable
WHERE PhaseID = @PhaseID OR @PhaseID IS NULL

但是如果@PhaseID为null,它将返回所有记录,而我需要查询以仅返回第一条记录和第四条记录。

DECLARE @PhaseID INT 
SET @PhaseID = 1 --works

请问如何实现?

我已经提到了其他几个问题,但是没有成功。 SQL Query Where Clause for Null OR Match (only return 1)?

3 个答案:

答案 0 :(得分:1)

您可以使用Dynamic SQL来做到这一点。

DECLARE @PhaseID INT
SET @PhaseID = 1

DECLARE @Sql NVARCHAR(MAX)
SET @Sql = 'SELECT * FROM TestTable WHERE '

IF @PhaseID IS NOT NULL
SET @Sql = @Sql + 'PhaseID = @_PhaseID'
ELSE
SET @Sql = @Sql + 'PhaseID IS NULL'

EXEC sp_executesql @Sql,N'@_PhaseID int',@_PhaseID = @PhaseID

答案 1 :(得分:0)

您需要PhaseID而不是@PhaseID

Select * 
from TestTable
Where (PhaseID = @PhaseID OR PhaseID IS NULL);

但是,我会考虑:

. . .
WHERE (@PhaseID IS NOT NULL AND PhaseID = @PhaseID) OR
      (@PhaseID IS NULL AND PhaseID IS NULL);

答案 2 :(得分:-1)

当前您正在做的@PhaseIDNULL,因为您引用了IS NULL检查的参数,所以它会返回4行。

Declare @PhaseID int
SET @PhaseID = NULL

Select * 
from #Data
Where PhaseID = @PhaseID OR @PhaseID IS NULL

这通过使用PhaseID作为列引用而不是引用参数来带回第1行和第4行。

Select * 
from #Data
Where PhaseID = @PhaseID OR PhaseID IS NULL