Подтвердить что ты не робот

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

Ответ 1

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)

Ответ 2

Это похоже на Адама Робинсона, но использует 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)

Ответ 3

Это может быть мертвая лошадь, еще один способ вернуть 1 строку, если нет строк, - это UNION другой запрос и отображение результатов, когда они не существуют в таблице.

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
) 

Ответ 4

Что-то вроде:

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

Ответ 5

Я прочитал все ответы здесь, и потребовалось время, чтобы выяснить, что происходит. Ниже приводится ответ Moe Sisko и некоторые связанные с ним исследования

Если ваш 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'

Ответ 6

Никакая запись не соответствует возврату записи. Там нет места для "значения" 0, если никакие записи не найдены. Вы могли бы создать безумный запрос UNION, чтобы делать то, что хотите, но намного, гораздо лучше, просто проверить количество записей в наборе результатов.

Ответ 7

Вам нужно только заменить WHERE LEFT JOIN:

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 ...

Ответ 8

Как насчет WITH TIES?

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]

Ответ 9

Это может быть одним из способов.

SELECT TOP 1 [Column Name] FROM (SELECT [Column Name] FROM [table]
    WHERE [conditions]
    UNION ALL
    SELECT 0 )A ORDER BY [Column Name] DESC