Возвращает значение, если строки не найдены SQL
вот мой простой запрос. Если я запрошу запись,которая не существует, я ничего не получу. Я бы предпочел, чтобы false (0) возвращался в этом сценарии. Ищу метод с учета нет записей.
SELECT CASE
WHEN S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1) THEN 1
ELSE 0
END AS [Value]
FROM Sites S
WHERE S.Id = @SiteId
9 ответов
SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END AS [Value]
FROM Sites S
WHERE S.Id = @SiteId and S.Status = 1 AND
(S.WebUserId = @WebUserId OR S.AllowUploads = 1)
это похоже на Адама Робинсона, но использует ISNULL вместо COUNT.
SELECT ISNULL(
(SELECT 1 FROM Sites S
WHERE S.Id = @SiteId and S.Status = 1 AND
(S.WebUserId = @WebUserId OR S.AllowUploads = 1)), 0)
Если внутренний запрос имеет соответствующую строку, возвращается 1. Внешний запрос (с ISNULL) затем возвращает это значение 1. Если внутренний запрос не имеет соответствующей строки, он ничего не возвращает. Внешний запрос обрабатывает это как NULL, и поэтому ISNULL возвращает 0.
Это может быть мертвая лошадь, другой способ вернуть 1 строку, когда нет строк, - объединить другой запрос и отобразить результаты, когда их нет в таблице.
SELECT S.Status, COUNT(s.id) AS StatusCount
FROM Sites S
WHERE S.Id = @SiteId
GROUP BY s.Status
UNION ALL --UNION BACK ON TABLE WITH NOT EXISTS
SELECT 'N/A' AS Status, 0 AS StatusCount
WHERE NOT EXISTS (SELECT 1
FROM Sites S
WHERE S.Id = @SiteId
)
что-то типа:
if exists (select top 1 * from Sites S where S.Id IS NOT NULL AND S.Status = 1 AND (S.WebUserId = @WebUserId OR S.AllowUploads = 1))
select 1
else
select 0
Я прочитал все ответы здесь, и потребовалось некоторое время, чтобы понять, что происходит. Следующее основано на ответе МЧС Сиско и некоторые связанные исследования
Если ваш SQL-запрос не возвращает никаких данных, нет поля с нулевым значением, поэтому ни ISNULL, ни COALESCE не будут работать так, как вы хотите. С помощью подзапроса запрос верхнего уровня получает поле с нулевым значением, и оба ISNULL и COALESCE будут работать так, как вы хотите/ожидаете их к.
запрос
select isnull(
(select ASSIGNMENTM1.NAME
from dbo.ASSIGNMENTM1
where ASSIGNMENTM1.NAME = ?)
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'
мой запрос с комментариями
select isnull(
--sub query either returns a value or returns nothing (no value)
(select ASSIGNMENTM1.NAME
from dbo.ASSIGNMENTM1
where ASSIGNMENTM1.NAME = ?)
--If there is a value it is displayed
--If no value, it is perceived as a field with a null value,
--so the isnull function can give the desired results
, 'Nothing Found') as 'ASSIGNMENTM1.NAME'
нет записи соответствовали означает нет записи возвращаются. Нет места для" значения " 0, если записи не найдены. Вы можете создать сумасшедший запрос объединения, чтобы сделать то, что вы хотите, но гораздо, гораздо, гораздо лучше просто проверить количество записей в результирующем наборе.
вам нужно только заменить WHERE на левое соединение:
SELECT CASE
WHEN S.Id IS NOT NULL AND S.Status = 1 AND ...) THEN 1
ELSE 0
END AS [Value]
FROM (SELECT @SiteId AS Id) R
LEFT JOIN Sites S ON S.Id = R.Id
такое решение позволяет вернуть значения по умолчанию для каждого столбца, например:
SELECT
CASE WHEN S.Id IS NULL THEN 0 ELSE S.Col1 END AS Col1,
S.Col2,
ISNULL(S.Col3, 0) AS Col3
FROM
(SELECT @Id AS Id) R
LEFT JOIN Sites S ON S.Id = R.Id AND S.Status = 1 AND ...
Как насчет галстуков?
SELECT TOP 1 WITH TIES tbl1.* FROM
(SELECT CASE WHEN S.Id IS NOT NULL AND S.Status = 1
AND (S.WebUserId = @WebUserId OR
S.AllowUploads = 1)
THEN 1
ELSE 0 AS [Value]
FROM Sites S
WHERE S.Id = @SiteId) as tbl1
ORDER BY tbl1.[Value]
Это может быть один из способов.
SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table]
WHERE [conditions]
UNION ALL
SELECT 0 )A ORDER BY [Column Name] DESC