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
我在一个存储过程中有一个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