Можно ли в sql получить результат который не найден?
Можно ли в sql получить результат который не найден?
SELECT name FROM `names` WHERE name IN ('vasya','json','liza','vladimir','andrey');
возвращает:
vasya
liza
а как сделать, чтобы возвращало:
json
vladimir
andrey
?
Работает так:
WITH vals (Name) AS (VALUES ('vasya'),('json'),('liza'),('vladimir'),('andrey')))
SELECT Name FROM vals
WHERE Name NOT IN (
SELECT *
FROM `Names`
WHERE Name IN (SELECT * FROM vals)
)
Ответы (2 шт):
Для того, что вывести результат, обратный найденному, используется отрицание NOT
SELECT name
FROM `names`
WHERE name NOT IN ('vasya','json','liza','vladimir','andrey');
И теперь запрос читается, как, Выведи значения поля name, где name не содержит следующие значения
Самый оптимальный вариант, наверное, был бы с использованием временной таблицы. Создать ее, сохранить туда эти имена как константы.
CREATE TABLE temp_names (`name` varchar(16));
INSERT INTO temp_names VALUES ('vasya'), ('json'), ('liza'), ('vladimir'), ('andrey');
и дальше уже использовать вложенные запросы:
SELECT `name`
FROM `temp_names`
WHERE `name` NOT IN (
SELECT `name` FROM `names` WHERE name IN (
SELECT `name` FROM `temp_names`
)
)
Вот пример: http://sqlfiddle.com/#!9/1161d4/3
Хотя в общем-то можно написать и короче.
SELECT `name`
FROM `temp_names`
WHERE `name` NOT IN (
SELECT `name` FROM `names`
)
Но на больших таблицах может работать медленей первого варианта.
Если временные таблицы не подходят, то можно попробовать вариант создания такой таблицы прямо в запросе.
SELECT `name` FROM
(SELECT 'vasya' AS `name`
UNION SELECT 'json' AS `name`
UNION SELECT 'liza' AS `name`
UNION SELECT 'vladimir' AS `name`
UNION SELECT 'andrey' AS `name`
) AS t
WHERE `name` NOT IN (
SELECT `name` FROM `names`
);
Это вариация предыдущего варианта, только константы берутся не из временной таблицы, а формируются в запросе.