如何在IF条件联接查询中使用大小写语法?

时间:2018-10-12 15:09:39

标签: sql sql-server tsql

如何在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;  

2 个答案:

答案 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;