SQL return 1 以防 count 大于 0 时切换

SQL return 1 in case switch when count is bigger than 0

我在一个存储过程中有一个int类型的输入列表,每个id都有一个文档,每个文档都有多个子文档。已连接 subdocument.DocumentId = document.DocumentId

我要做的是return一个对象列表(document.DocumentId int, IsValid bool)。

如果每个连接的子文档的 2 列不为空,则布尔值为真。

PARAMLIST:ID 列表

SELECT 
    IDS.ParamList AS documentId,
    CASE 
        WHEN (SELECT COUNT(*) 
              FROM Document D
              JOIN SubDocument SD ON SD.DocumentId = D.DocumentId
              WHERE SD.DocumentId = IDS.ParamList 
                AND SD.PaymentDate IS NULL 
                AND SD.ConnectionContractIsAcceptedDate IS NULL) > 0
             THEN 1
             ELSE 0 
    END AS IsValid
FROM 
    @documentIds IDS

如您所见,我的逻辑是进行大小写切换,我计算每个 SubDocument 至少没有填充一列,但查询没有 return任何只是 2 列名称

文档table:

DocumentId CreatedBy
1 John
2 Jill

子文档table:

SubDocumentId DocumentId Field1 Field2
3 1 NULL 2010-02-02
4 2 2021-01-01 2018-03-03
5 1 2020-10-10 2015-11-15
6 2 2019-10-01 2013-12-12

这里的预期结果是:

DocumentId IsValid
1 false
2 true

您可以将 table 变量加入到 table 中。
然后使用条件聚合计算IsValid。

declare @DocumentIds table (
 DocumentId int
);

insert into @DocumentIds values (1),(2);

SELECT Doc.DocumentId, Doc.CreatedBy
, CAST(MIN(
      CASE
      WHEN (SubDoc.Field1 IS NULL OR SubDoc.Field2 IS NULL) 
      THEN 0
      ELSE 1
      END) AS BIT) AS IsValid
FROM Document Doc
JOIN @DocumentIds Ids 
  ON Ids.DocumentId = Doc.DocumentId
LEFT JOIN SubDocument SubDoc
  ON SubDoc.DocumentId = Doc.DocumentId
GROUP BY Doc.DocumentId, Doc.CreatedBy
ORDER BY Doc.DocumentId;
DocumentId CreatedBy IsValid
1 John False
2 Jill True

演示 db<>fiddle here