如何解决此查询以同时满足两个条件?

时间:2019-03-29 14:32:10

标签: sql sql-server

我是SQL Server新手。我需要过滤查询,但不确定如何。我的查询已包含其中的联接,为简单起见,在此将其省略。

SELECT Name, Date
FROM my_table AS C
WHERE Date = '2019-04-15' AND Date IS NULL

My_table的数据如下:

Name    Date
---------------------
John    2019-04-01
Ally    2019-04-01
Steve   NULL
James   2019-04-15
James   NULL

如果针对任何where条件运行查询,则仅获得一个条件的预期结果。但是,加上AND不会产生任何结果。使用OR给我最后3条记录。但是我正在寻找的是将其过滤掉,所以我只会看到最后2条记录,因为James的记录与日期匹配,并且记录的日期为NULL。

如何过滤匹配两个条件的名称?预先感谢。

5 个答案:

答案 0 :(得分:2)

您可以尝试以下方法:

SELECT a.name
FROM   my_table a
JOIN   my_table b
  ON   a.name = b.name
 AND   b.date IS NULL
WHERE  a.date = '2019-04-15';

当然,如果有多个名称为NULL的特定名称的记录,则会得到多个结果。

这可以通过以下方式解决:

SELECT a.name
FROM   my_table a
WHERE  a.date = '2019-04-15'
  AND  EXISTS (SELECT *
               FROM   my_table b
               WHERE  a.name = b.name
                 AND  b.date IS NULL);

答案 1 :(得分:1)

来自您的评论:

  

我正在寻找所有具有特定日期的行和一个   日期为NULL的同名行

您可以使用EXISTS做到这一点:

select name 
from my_table t
where 
  date = '2019-04-15'
  and exists (
    select 1 from my_table
    where name = t.name and date is null
  )

修改
如果要同时使用具有非空日期的行和具有无效日期的行:

select t.* 
from my_table t
where ( 
  date = '2019-04-15'
  and exists (
    select 1 from my_table
    where name = t.name and date is null
  )
) or (
  date is null
  and exists (
    select 1 from my_table
    where name = t.name and date = '2019-04-15'
  )  
)

请参见demo

答案 2 :(得分:0)

尝试一下:

SELECT 
    Name, 
    Date,
    COUNT(C.Date)
FROM my_table AS C

having COUNT(C.Date) > 1
group by
    Name, 
    Date

答案 3 :(得分:0)

NullReferenceException

答案 4 :(得分:0)

如果您还需要具有NULL值的行,则可以尝试以下操作。

SELECT m.name,m.Date
FROM   my_table m
WHERE  (m.date = '2019-04-15' OR m.date IS NULL
AND  EXISTS (SELECT 1
           FROM   my_table im
           WHERE  m.name = im.name
             AND  im.date IS NOT NULL))

这也可以通过使用SELF JOIN实现。

SELECT DISTINCT m.name,m.Date
FROM   my_table m
INNER JOIN my_table im ON im.Name = m.Name
WHERE  (m.date = '2019-04-15' OR m.date IS NULL
 AND im.Date IS NOT NULL)