Возвращает значение, если строки не найдены 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
Comments