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)?
答案 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)
当前您正在做的@PhaseID
是NULL
,因为您引用了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