我是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。
如何过滤匹配两个条件的名称?预先感谢。
答案 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)