我有一个名为“过程”的表格。它包含以下列:
状态可以是1,2,3和null。
现在我有一个带网格,下拉菜单和按钮的页面。下拉包含“已批准(1),已拒登(2),已取消(3)”选项。我正在做的是如果下拉列表中没有选择,我将获取所有记录。我得到下拉值,如果下拉列表中没有选择,则为null。在SQL查询中,我实现了如果 @status 参数为null然后获取所有记录,如果 @status 参数获取值(1,2,3),那么我过滤它。以下是查询:
@status as int = null
Select *
From Process
where @status IS NULL
Or Process.status = @status
直到这里,一切对我来说都很好。现在有趣的是我需要在下拉列表中添加一个新选项正在进行中。在进程表中, 正在进行的进程具有空值。如果@status为null则我已经做出决定以获取所有记录。如果在下拉列表中没有选择以获取所有记录并且如果选择“正在进行”,那么我如何管理然后仅获取状态为空的记录?请建议。
答案 0 :(得分:2)
我想你想要这样的东西:
Select p.*
From Process p
where coalesce(p.status, 'In Progress') = @status;
我应该注意您的查询不正确,因为= NULL
从不返回true。我假设您希望原始查询为:
Select *
From Process
where @status is null or
Process.status = @status
答案 1 :(得分:1)
我认为你应该为进行中状态创建一个新标签,而不是为了这个目的而试图依赖NULL
。您可以在数据库级别通过status
列的默认值实现此目的:
ALTER TABLE Process ALTER COLUMN status SET DEFAULT 4
现在,如果您看到状态值4
,您将知道用户尚未选择值,他应该选择。
顺便说一下,正如@Gordon已经指出的那样,你不能使用equals来比较SQL Server(或MySQL)中的NULL
值,而是必须使用IS NULL
或{{1} },例如
IS NOT NULL
答案 2 :(得分:1)
这样做
IF @status = 'INPROGRESS'
Select *
From Process
where Process.status IS NULL
ELSE IF @status <> ''
Select *
From Process
where Process.status = @status
ELSE
Select *
From Process
答案 3 :(得分:0)
您可以在此处为新的下拉项“正在进行”分配值,例如0 =正在进行中。因此,当从下拉列表中选择正在进行时,您将获得值@status = 0。然后您可以尝试以下查询
Select *
From Process
where @status IS NULL
Or ISNULL(Process.status,0) = @status --(here @status is 0 or 1 or 2 or 3)