sql中的嵌套条件

时间:2015-07-16 03:03:05

标签: sql

我在sql中有where条件:

WHERE
  ( Spectrum.access.dim_member.centene_ind = 0  )
  AND  
  (
   Spectrum.access.Client_List_Groups.Group_Name  IN  ( 'Centene Health Plan     Book of Business'  )
   AND
   Spectrum.access.dim_member.referral_route  IN  ( 'Claims Data'  )
   AND
   ***(
    Spectrum.access.fact_task_metrics.task  =  'Conduct IHA'
    AND
Spectrum.access.fact_task_metrics.created_by_name  <>  'BMU, BMU'
AND
Spectrum.access.fact_task_metrics.created_date  BETWEEN  '01/01/2015 00:0:0'  AND  '06/30/2015 00:0:0'
   )***
AND
***(
Spectrum.access.fact_outreach_metrics.outreach_type  IN  ( 'Conduct IHA'  )
AND
(
 Spectrum.dbo.ufnTruncDate(Spectrum.access.fact_outreach_metrics.metric_date)  >=  Spectrum.access.fact_task_metrics.metric_date
 OR
 Spectrum.access.fact_outreach_metrics.metric_date  >=  Spectrum.access.fact_task_metrics.created_date
)
)***
AND
Spectrum.access.fact_outreach_metrics.episode_seq  =  1
AND
Spectrum.access.dim_member.reinstated_date  Is Null  
)

我在上面的代码中标记了两个条件。

第一个条件有2个AND运算符。

第二个条件有AND和OR运算符。

问题1:删除外括号“(”在第一个条件中会影响结果吗?

问题2:删除外括号“(”在第二个条件下会影响结果吗?

取下外支架后,滤镜将如下所示:

   Spectrum.access.dim_member.referral_route  IN  ( 'Claims Data'  )
   AND

    Spectrum.access.fact_task_metrics.task  =  'Conduct IHA'
    AND
Spectrum.access.fact_task_metrics.created_by_name  <>  'BMU, BMU'
AND
Spectrum.access.fact_task_metrics.created_date  BETWEEN  '01/01/2015 00:0:0'  AND  '06/30/2015 00:0:0'

AND

Spectrum.access.fact_outreach_metrics.outreach_type  IN  ( 'Conduct IHA'  )
AND
(
 Spectrum.dbo.ufnTruncDate(Spectrum.access.fact_outreach_metrics.metric_date)  >=  Spectrum.access.fact_task_metrics.metric_date
 OR
 Spectrum.access.fact_outreach_metrics.metric_date  >=  Spectrum.access.fact_task_metrics.created_date
)

AND
Spectrum.access.fact_outreach_metrics.episode_seq  =  1

感谢您的帮助。

此致 犹大书

2 个答案:

答案 0 :(得分:2)

当在括号集内计算这些表达式时,操作顺序规定在OR之前处理AND。

WHERE (A AND B) OR (C AND D)

相当于:

WHERE A AND B OR C AND D

但是下面的例子:

WHERE (A OR B) AND (C OR D)

不等于:

WHERE A OR B AND C OR D

真正成为:

WHERE A OR (B AND C) OR D

答案 1 :(得分:1)

从技术上讲,您应该能够安全地删除两个示例中的有问题的括号。使用AND语句,您将所有条件添加到一起就成为一个大条件。使用OR子句时,应仔细放置括号,以便正确分割组。

考虑以下例子:

a) where y = 1 AND n = 2 AND x = 3 or x = 5
b) where y = 1 AND n = 2 AND (x = 3 or x = 5)
c) where (y = 1 AND n = 2 AND x = 3) or x = 5

在示例A中,预期结果尚不清楚。

在例B中,预期结果表明必须满足所有条件,X可以是3或5。

在示例C中,预期结果表明Y = 1,N = 2且X = 3 OR x = 5。只要X = 5,Y和N相等就无关紧要。