以下方案的匹配标准

时间:2014-12-26 07:22:43

标签: sql sql-server sql-server-2008 tsql

enter image description here 参考上图。我有表诊断,服务和预防服务,其中我在诊断和PreventativeServices中有一个名为DxCode的公共字段。 PreventativeServices表中的DxCode是一个可选字段,因为它充当我们的配置表。假设DxCode = DiagnosisCode,我有以下场景,基于图像:

  1. 如果我们在服务和诊断表中都有DxCode,那么在DxCode上进行比较,结果行应输出比较。如果找到输出将是10060否则没有行。

  2. 如果我们在PreventativeServices中有DxCode = null或空白,那么再次输出将是10060。

  3. 如果我们的诊断表中没有针对RegistrationId = 247237的行,但我们在PreventativeServices中有一行以及诊断代码,那么结果将再次没有行,否则

  4. out put将是10060

  5. 我有以下查询:

    SELECT [ServiceID] AS PreventativeServiceId,
           [CPTCode]
    FROM   PreventativeService ps
           INNER JOIN [Services] s(NOLOCK)
                   ON ps.CPTCode = s.ServiceCode
           LEFT JOIN Diagnoses dx(NOLOCK)
                  ON dx.RegistrationID = s.RegistrationID
    WHERE  s.RegistrationId = @RegistrationId
           AND ps.IsActive = 1
           AND @AdmitDate BETWEEN ps.StartDate AND Isnull(PS.EndDate, @AdmitDate)
           AND @Gender = Isnull(ps.Gender, @Gender)
           AND @Age BETWEEN Isnull(ps.AgeFrom, @Age) AND Isnull(ps.AgeTo, @Age)
           AND dx.DiagnosisCode = ( CASE
                                      WHEN Rtrim(Ltrim(ps.DiagnosisCode)) = '' THEN dx.DiagnosisCode
                                      ELSE ps.DiagnosisCode
                                    END ) 
    

    注意

    PreventativeServices中的DiagnosisCode也将包含null和空白。

    要求

    dx.DiagnosisCode = ( CASE
                           WHEN Rtrim(Ltrim(ps.DiagnosisCode)) = '' THEN dx.DiagnosisCode
                           ELSE ps.DiagnosisCode
                         END )  
    
    如果在PreventativeServices中有空白('')诊断且在诊断表中没有行

    方案失败了

1 个答案:

答案 0 :(得分:0)

好的,这是因为null = null总是返回false。您可以尝试使用isnull函数。

    isnull(dx.DiagnosisCode,' ') = (
    CASE 
        WHEN rtrim(ltrim(ps.DiagnosisCode)) = ''
            THEN isnull(dx.DiagnosisCode,' ')
        ELSE ps.DiagnosisCode
        END
    )