Определить, не возвращало ли предложение where in в запросе select значение

avatar
Amit
7 апреля 2018 в 22:15
88
2
3

У меня есть оператор SQL, который ищет в базе данных несколько записей.

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

Первые два имени («Ник», «Джек») существуют в базе данных People_DB, и мой запрос возвращает эту информацию, однако не возвращает «Роберт», поскольку его нет в моей базе данных.

Есть ли способ вернуть "Роберт не находится в People_DB" в наборе результатов запроса?

Источник
Gordon Linoff
7 апреля 2018 в 22:32
1

Отметьте свой вопрос с помощью базы данных, которую вы используете.

Ответы (2)

avatar
Gordon Linoff
7 апреля 2018 в 22:34
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;
avatar
SQLHelp
7 апреля 2018 в 22:26
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')