如果在SQL Server中有两个含义的值为null,如何获取记录?

时间:2016-11-17 06:07:16

标签: mysql sql-server

我有一个名为“过程”的表格。它包含以下列:

  • PROCESS_ID
  • process_type
  • 状态
  • CREATED_DATE
  • updated_date
  • CREATED_BY

状态可以是1,2,3和null。

  • 状态1 =已批准的流程
  • 状态2 =拒登过程
  • 状态3 =已取消的流程
  • status 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则我已经做出决定以获取所有记录。如果在下拉列表中没有选择以获取所有记录并且如果选择“正在进行”,那么我如何管理然后仅获取状态为空的记录?请建议。

4 个答案:

答案 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)