SQL语句条件为空值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句条件为空值相关的知识,希望对你有一定的参考价值。

参考技术A

方法一:

select * from usertable 

where (name=@name and page=@page ) or name is null or page is null

方法二:

SELECT * FROM usertable WHERE name=ISNULL(NULLIF(@name,''),name) AND page=ISNULL(NULLIF(@page,''),page)

方法三:

select * from tb where (@name id null or name=@name ) and (page is null or page=@page )

扩展资料:

SQL中时间为空的处理小结

1、如果不输入null值,当时间为空时,会默认写入"1900-01-01",在业务处理时很麻烦。

ctrl+0即可输入NULL值。

2、用case进行查询,若写成:

select (case DateTime1 when NULL then 'a' else 'b' end) from TestTable

则查询结果为:

b

b

b

这显然不是想要的结果;需要写成:

select (case DateTime1 when DateTime1 then 'b' else 'a' end) from TestTable

其查询结果才为:

b

a

b

这才是想要的结果。

如何将不符合WHERE条件的联接表中的数据包含为空值(SQL)

我有2名员工和医疗休假,这些员工与员工ID相关,基本上医疗休假表将包含多个休假的单个员工的多个数据,我想在病假的当月过滤掉数据,并将过滤月份未发生病假的员工包括为空值。

       EMPLOYEES                  MEDICAL
    |employee|ID|             |ID|DateOfLeave|
         A     1                1   2019/1/3
         B     2                1   2019/4/15
         C     3                2   2019/5/16
         D     4

sql语句我提出过滤假期的特定月份并计算他们在该月份休假的次数,例如1月,它还包括没有任何假期的员工为'0',但是员工谁有1月份没有出现的医疗叶片根本没有出现在结果集中,我怎样才能证明他们在1月份有0个医疗叶片?

select employees.employee, employees.ID,
 count(medical.DateOfLeave) as NumberOfLeaves
from employees
left outer join medical on employees.ID = medical.ID
where (MONTH(DateOfLeave) = 1) or (medical.DateOfLeave is null)
group by employees.employee,employees.ID
           RESULT SET
    |Employee|ID|NumberOfLeaves|
        A      1      1
        C      3      0   
        D      4      0

正如你所看到的B消失了,但是我希望它在结果集中显示为像雇员C和D一样的'0'

我知道这是因为员工B的医疗数据不符合where子句的条件,但我如何撰写一份声明,其中包括医疗叶片的员工,这些员工在1月份的结果集中不会发生0?

答案

您的查询仅显示1月份休假或根本没有休假的员工的结果。

相反,如果有指定月份的记录,您只想加入医疗表中的记录,然后您将对结果进行分组并从那里获取计数。

为此,您需要更改联接的条件以包含“月”过滤器。

这是一个使用表变量的工作示例

DECLARE @Employees TABLE (ID INT, Employee CHAR(1))
DECLARE @Medical TABLE (ID INT, DateOfLeave DATE)

INSERT INTO @Employees
VALUES (1, 'A'), (2,'B'), (3,'C'), (4, 'D')

INSERT INTO @Medical 
VALUES (1, '2019-01-03'), (1, '2019-04-15'), (2, '2019-05-16')

SELECT          e.employee, 
                e.ID,
                count(m.DateOfLeave) AS NumberOfLeaves
FROM            @Employees e
LEFT OUTER JOIN @Medical m ON   e.ID = m.ID AND MONTH(DateOfLeave) = 1
GROUP BY        e.employee,e.ID
另一答案

左外连接将首先连接表然后过滤。在你的情况下,B在连接中被省略,这就是过滤器无法工作的原因。你可以试试这个

select employees.employee, employees.ID,
 nvl(count(medical.DateOfLeave),0) as NumberOfLeaves
from employees
left outer join (select * from medical 
where (MONTH(DateOfLeave) = 1)) 
on employees.ID = medical.ID
group by employees.employee,employees.ID

或者你也可以尝试这个

   select e.id, employee, count(dateofleave)
from employee e, medical m
where e.id = m.id
and month(m.DateOfLeave) = 1
group by e.id, employee
UNION ALL
select id, employee, 0
from employee e
where not exists(select 1 from medical m
where e.id = m.id
and month(m.DateOfLeave) = 1

以上是关于SQL语句条件为空值的主要内容,如果未能解决你的问题,请参考以下文章

关于SQL多条件查询问题: 若其中一条件为空值如何设置忽略该条件而用其它条件组合查询??

sql语句日期输入空值报错

如何往数据库插入字段为空值的sql语句

sql中更新某个字段中部分空值的语句怎样写?

sql 语句 查询 为空的

如何将不符合WHERE条件的联接表中的数据包含为空值(SQL)