如何在IF条件联接查询中使用大小写语法?
如何在单个case else语句中包含这两个选择查询块?
declare @provid int
declare @stageprovid int
-- If this Syntax satisfies, then don't execute the next syntax.
-- If this syntax does not satisfy, then execute the next block.
SELECT @provid = prv.ID
FROM StagingProvider StagePrv
JOIN Providers prv
ON StagePrv.ClientID = prv.ClientID
AND prv.ExternalProviderID = StagePrv.[Provider_ID]
WHERE StagePrv.ID = @stageprovid;
-- This block of syntax executes only if the first block did not satisfy.
SELECT @provid = prv.ID
FROM StagingProvider StagePrv
JOIN Providers prv
ON StagePrv.ClientID = StagePrv.ClientID
AND prv.NPI = StagePrv.NPI
WHERE StagePrv.ID = @stageprovid;
答案 0 :(得分:2)
我很确定我终于明白了您要问的问题,答案是“不”,您不能按照您的想法使用CASE表达式来控制JOIN条件。
如果我对您的理解正确,那么您可以做自己想做的事情的方法是在JOIN条件下使用OR,然后将TOP 1与ORDER BY一起使用,将结果优先于正确的结果:
SELECT TOP 1 @provid = prv.ID
FROM StagingProvider StagePrv
JOIN Providers prv
ON StagePrv.ClientID = prv.ClientID
AND (
prv.ExternalProviderID = StagePrv.[Provider_ID]
OR prv.NPI = StagePrv.NPI
)
WHERE StagePrv.ID = @stageprovid
ORDER BY CASE
WHEN prv.ExternalProviderID = StagePrv.[Provider_ID] THEN 0
ELSE 1
END;
另一种可能更好的方法是使用UNION,但是我认为这可能更接近您的要求。
答案 1 :(得分:1)
我正在读这篇文章,如果您可以在第一个加入条件下找到一个ID,那就很好。如果不能,则需要继续第二个加入条件。在这种情况下,您可以尝试将两次联接到表中。在这种情况下,如果第一个联接上没有ID,则在第二个联接上拾取ID。
SELECT @provid = COALESCE(first.ID, second.ID)
FROM StagingProvider StagePrv
LEFT JOIN Providers prv AS first
ON StagePrv.ClientID = prv.ClientID
AND prv.ExternalProviderID = StagePrv.[Provider_ID]
LEFT JOIN Providers prv AS second
ON StagePrv.ClientID = StagePrv.ClientID
AND prv.NPI = StagePrv.NPI
WHERE StagePrv.ID = @stageprovid;
请注意,如果您非常想这样做,可以将其写为CASE:
SELECT @provid = CASE WHEN first.ID IS NOT NULL
THEN first.ID
ELSE second.ID
END
FROM StagingProvider StagePrv
LEFT JOIN Providers prv AS first
ON StagePrv.ClientID = prv.ClientID
AND prv.ExternalProviderID = StagePrv.[Provider_ID]
LEFT JOIN Providers prv AS second
ON StagePrv.ClientID = StagePrv.ClientID
AND prv.NPI = StagePrv.NPI
WHERE StagePrv.ID = @stageprovid;