确定select查询中where where子句是否未返回值

时间:2018-04-07 22:15:24

标签: sql sql-server-2014

我有一个SQL语句,它在数据库中搜索一些记录。

SELECT UserName
     , Location
FROM People_DB
WHERE UserName IN ('Nick', 'Jack', 'Robert')

前两个名字('Nick','Jack')存在于People_DB中,我的查询返回该信息但是它不返回'Robert',因为它在我的数据库中不存在。

有没有办法在查询结果集中返回'Robert不在People_DB中'?

2 个答案:

答案 0 :(得分:0)

没有直接的做法。

你可以使用这样的东西

drop table #temp

select 'Nick' as  UserName into #temp
union select 'Jack' 
union select 'Robert'

SELECT t.UserName,isnull(b.UserName,'Doesn''t exists',b.Location 
FROM #temp t
left join People_DB b on t.UserName = b.UserName
WHERE b.UserName IN ('Nick', 'Jack', 'Robert')

答案 1 :(得分:0)

你需要构建一个"表"列表名称。这是将它们放回结果集的唯一方法。

如果您的数据库支持values()构造函数,我建议:

SELECT u.UserName, p.Location
FROM (VALUES ('Nick'), ('Jack'), ('Robert') ) v(UserName) LEFT JOIN
     People_DB p
     ON p.UserName = v.UserName;

我应该注意,几乎所有不支持VALUES的数据库都提供了替代解决方案。例如:

SELECT u.UserName, p.Location
FROM (SELECT 'Nick' as UserName UNION ALL
      SELECT 'Jack' UNION ALL
      SELECT 'Robert'
     ) v LEFT JOIN
     People_DB p
     ON p.UserName = v.UserName;

NULL位置可能足以表明找不到该名称。如果您想要实际标记,可以使用CASE

SELECT u.UserName, p.Location,
       (CASE WHEN p.UserName IS NULL THEN 0 ELSE 1 END) as in_list_flag
FROM (VALUES ('Nick'), ('Jack'), ('Robert') v(UserName) LEFT JOIN
     People_DB p
     ON p.UserName = v.UserName;