【问题标题】:How to filter for rows with NOT NULLS in 2 columns如何过滤 2 列中包含 NOT NULLS 的行
【发布时间】:2013-11-28 10:15:01
【问题描述】:

我一直在努力过滤以仅显示 2 列中没有 NULLS 的行。

  • 我只想要have a value in both Disability 1 and Disability 2 的客户(行)的结果。

  • 不想显示have a value in Disability 1 and NULL in Disability 2 or a NULL in Disability 1 and value in Disability 2 的客户(行)。

我的专栏是ClientName, ClientNumber, ClientAge, ClientGender, Disability1, Disability2

Disability 列是使用 CASE 的别名。

我发现的问题:

  • 无法在 Where 或 Have 子句中引用别名,这使得过滤变得困难。

  • Having 子句针对 2 个条件引用了 D.DiagnosisName,这意味着我没有返回任何结果。

不胜感激。

干杯

我的代码:

SELECT 
    C.ClientName, 
    C.ClientNumber, 
    C.ClientAge, 
    C.ClientGender,
    CASE 
        WHEN    D.DiagnosisName = 'Depression' 
                OR D.DiagnosisName = 'Anxiety' 
                OR D.DiagnosisName = 'Drug and Alcohol' 
                OR D.DiagnosisName = 'Bipolar Disorder' 
                OR D.DiagnosisName = 'Delusional' 
                OR D.DiagnosisName = 'Eating Disorder' 
                OR D.DiagnosisName = 'Obsessive Compulsive Disorder' 
                OR D.DiagnosisName = 'Personality Disorder' 
                OR D.DiagnosisName = 'Post Traumatic Stress Disorder' 
                OR D.DiagnosisName = 'Post-Natal' 
                OR D.DiagnosisName = 'Schizo-affective disorder' 
                OR D.DiagnosisName = 'Schizophrenia' 
                OR D.DiagnosisName = 'Other Psychiatric/Psychological Disorder' 
                OR D.DiagnosisName = 'BPD' 
                OR D.DiagnosisName = 'Psychiatric (other)' 
            THEN D.DiagnosisName 
    END AS [Disability1],
    CASE 
        WHEN    D.DiagnosisName = 'Autism' 
                OR D.DiagnosisName = 'Intellectual' 
                OR D.DiagnosisName = 'Specific Learning/ADD' 
                OR D.DiagnosisName = 'Acquired Brain Injury / Head Injury' 
                OR D.DiagnosisName = ' Acquired Brain Injury-Head Injury' 
                OR D.DiagnosisName = 'Neurological' 
        THEN D.DiagnosisName 
    END AS [Disability2]

FROM 
    dbo.FACTClientDiagnosis R
    RIGHT OUTER JOIN DimClient C ON R.DimClientID = C.DimClientID
    LEFT OUTER JOIN DimDiagnosisType D ON R.DimDiagnosisTypeID = D.DimDiagnosisTypeID

WHERE 
    ClientStatus = 'Active'     
    AND ClientType = 'Client'
    AND D.DiagnosisName NOT LIKE 'NULL'

GROUP BY 
    C.ClientName, 
    C.ClientNumber, 
    C.ClientAge, 
    C.ClientGender, 
    D.DiagnosisName

HAVING 
    (
        D.DiagnosisName = 'Depression' 
        OR D.DiagnosisName = 'Anxiety' 
        OR D.DiagnosisName = 'Drug and Alcohol' 
        OR D.DiagnosisName = 'Bipolar Disorder' 
        OR D.DiagnosisName = 'Delusional' 
        OR D.DiagnosisName = 'Eating Disorder' 
        OR D.DiagnosisName = 'Obsessive Compulsive Disorder' 
        OR D.DiagnosisName = 'Personality Disorder' 
        OR D.DiagnosisName = 'Post Traumatic Stress Disorder' 
        OR D.DiagnosisName = 'Post-Natal' 
        OR D.DiagnosisName = 'Schizo-affective disorder' 
        OR D.DiagnosisName = 'Schizophrenia' 
        OR D.DiagnosisName = 'Other Psychiatric/Psychological Disorder' 
        OR D.DiagnosisName = 'BPD' 
        OR D.DiagnosisName = 'Psychiatric (other)'
    )
    AND 
    (
        D.DiagnosisName = 'Autism' 
        OR D.DiagnosisName = 'Intellectual' 
        OR D.DiagnosisName = 'Specific Learning/ADD' 
        OR D.DiagnosisName = 'Acquired Brain Injury / Head Injury' 
        OR D.DiagnosisName = ' Acquired Brain Injury-Head Injury' 
        OR D.DiagnosisName = 'Neurological'
    ) 

ORDER BY 
    C.ClientName

【问题讨论】:

  • 只是一个观察,您可以用 IN 语句替换多个 OR 子句。

标签: sql filter null multiple-columns aliases


【解决方案1】:

您可以通过将派生/别名列包装在另一个SELECT .. FROM 中来过滤,如下所示。另外,我不明白为什么在这种情况下您需要HAVING - 过滤器可以移动到WHERE,因为您没有聚合过滤器。

SELECT ..., x.Disability1, x.Disability2, ...
FROM
(
    SELECT ... AS Disability1,
           ... AS Disability2
    FROM ...
    WHERE ...
    GROUP BY ...
) AS x
WHERE x.Disability1 IS NOT NULL AND x.Disability2 IS NOT NULL;

其他一些潜在问题

  • 您可以将重复的ORs 替换为IN ('Intellectual', 'Autism', ...)
  • 您有一个过滤器 (x in (a,b,c))... AND x IN (d,e,f) - 除非有重叠,否则不会返回任何记录。
  • 使用IS NULLIS NOT NULL 而非D.DiagnosisName NOT LIKE 'NULL' 检查空值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 2021-07-07
    • 1970-01-01
    • 2014-06-04
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多