Sql 如何在IF条件连接查询中使用Case语法?

Sql 如何在IF条件连接查询中使用Case语法?,sql,sql-server,tsql,Sql,Sql Server,Tsql,如何在IF条件连接查询中使用Case语法 如何在单个case-else语句中包含这两个select查询块 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

如何在IF条件连接查询中使用Case语法

如何在单个case-else语句中包含这两个select查询块

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;  

我很确定我终于理解了你想问的问题,答案是不,你不能用你所想的方式使用CASE表达式来控制连接条件

如果我正确理解了您的意思,那么您可以按照自己的意愿执行操作,方法是在联接条件中使用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;  

另一种可能更好的方法是使用联合,但我认为这可能更接近您的要求。

我正在阅读这篇文章,如果您可以在第一个连接条件下找到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;  
请注意,如果您非常想这样做,可以将其作为案例编写:

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;  

这个问题不是很清楚。我们需要了解该表的外观,以及您希望传递给provid和stageprovid的参数。@MEdwin,很抱歉。我做了一些改变。请检查您是否熟悉if语法@GordonLinoff,如果你愿意的话。什么样的可测量质量能决定第一块是否满足要求?