SQL Server: как вернуть Да или Нет, если вложенный запрос имеет результат или нет
У меня есть хранимая процедура с вложенным запросом, который проверяет, "category
"из основной таблицы соответствует"category
"в под-таблице. Таким образом, может быть либо одно совпадение, либо ни одного.
Может кто-нибудь сказать мне, как я могу вернуть Да, если есть совпадение, и подзапрос возвращает что-то, и Нет, если нет совпадения, и подзапрос ничего не возвращает?
Я попробовал следующее, которое работает в целом, но только если есть совпадение, иначе это ничего не возвращает.
Мой SQL (сокращенно):
SELECT A.categoryID,
A.category,
A.[description],
(
SELECT 'Yes' AS subscribed
FROM MOC_Categories_Subscribers D
WHERE D.category = A.category
FOR XML PATH(''), ELEMENTS, TYPE
)
FROM MOC_Categories A
Большое спасибо за любую помощь в этом, Тим.
3 ответа
Если подзапрос не возвращает никаких строк, тогда ваш результат будет NULL. Таким образом, вы должны проверить это. В SQL Server вы можете сделать это с помощью функций ISNULL
а также COALESCE
, это зависит от версии, которую вы используете
SELECT A.categoryID,
A.category,
A.[description],
COALESCE((SELECT TOP 1 'Yes'
FROM MOC_Categories_Subscribers D
WHERE D.category = A.category), 'No') AS Result
FROM MOC_Categories A
SELECT A.categoryID,
A.category,
A.[description],
(
SELECT
case
when count(subscribed) > 0 then 'Yes'
else 'No'
end
FROM MOC_Categories_Subscribers D
WHERE D.category = A.category
)
FROM MOC_Categories A
Вы можете использовать outer join
, который возвращает null
значения, если нет совпадения. Объединить с case
преобразовать в значение да / нет:
SELECT A.categoryID,
A.category,
A.[description],
subscribed = CASE
WHEN D.category IS NOT NULL THEN 'Yes'
ELSE 'No'
END,
FROM MOC_Categories A
LEFT OUTER JOIN MOC_Categories_Subscribers D
ON D.category = A.category