Как использовать синтаксис регистра в запросе к условию IF? - PullRequest
0 голосов
/ 12 октября 2018

Как использовать синтаксис регистра в запросе к условию IF?

Как получить эти два блока запроса выбора в одном операторе 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 голосов
/ 12 октября 2018

Я читаю это, что если вы можете найти идентификатор при первом условии соединения, у вас все хорошо.Если вы не можете, тогда вам нужно перейти ко второму условию соединения.Если это так, вы можете попробовать присоединиться дважды к вашему столу.В этом случае, если в первом соединении нет идентификатора, вы берете идентификатор во втором соединении.

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;  
0 голосов
/ 12 октября 2018

Я почти уверен, что наконец понял, что вы пытаетесь спросить, и ответ - Нет, вы не можете использовать выражение CASE так, как вы думаете, для управления условием JOIN.

Если вы правильно поняли, если вы правильно поняли, то можете использовать OR в условии JOIN и использовать 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, но я думаю, что это, вероятно, ближе к тому, что вы просите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...