Microsoft tSQL에 행이 없으면 값을 반환합니다. 반환되는 것을

Microsoft 버전의 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



답변

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)


답변

이것은 Adam Robinson과 유사하지만 COUNT 대신 ISNULL을 사용합니다.

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 개 행을 반환하는 또 다른 방법은 다른 쿼리를 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
) 


답변

다음과 같은 것 :

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


답변

나는 여기에서 모든 답을 읽었고 무슨 일이 일어나고 있는지 알아내는 데 시간이 걸렸습니다. 다음은 Moe Sisko 의 답변 및 일부 관련 연구를 기반으로합니다.

SQL 쿼리가 데이터를 반환하지 않는 경우 null 값을 가진 필드가 없으므로 ISNULL이나 COALESCE가 원하는대로 작동하지 않습니다. 하위 쿼리를 사용하여 최상위 쿼리는 null 값이있는 필드를 가져 오며 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'


답변

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


답변

일치하는 레코드 없음은 반환 된 레코드가 없음을 의미합니다. 레코드가 발견되지 않으면 0의 “값”이 갈 곳이 없습니다. 원하는 작업을 수행하기 위해 미친 UNION 쿼리를 만들 수 있지만 결과 집합의 레코드 수를 확인하는 것이 훨씬 더 좋습니다.