如果您从select

时间:2019-02-07 13:52:00

标签: sql oracle

我希望下面的sql语句根据是在特定字符串中找到结果还是需要搜索整个父组(例如,在表中包含以下内容),得出不同的结果:

   column 1, column 2
   a       - 1
   a       - 2
   a       - 3
   b       - 5
   b       - 7
   b       - 1

所以如果我输入1可以找到结果,它将显示我

 a -1
 b -1 
     

。问题是在where子句中同时存在父组和子组

我尝试用例并用ands和ors模拟if,但是没有用

  select 1, 
         aapv.aapv_keyext1,
         aapv.aapv_area,
         aapv.aapv_valuecharmax,
         aapv.aapv_valuechardefault,
       aapv.aapv_valuecharmin, aap.aap_ident
   from a_parameter_value aapv,
        a_parameter aap
  where aap.aap_ident in  (string1,string2,string3)
    and aap.aap_ref              = aapv.aap_ref
    and aap.aap_idento = string4
    and ((aapv.Aapv_Keyext1 = 'LaD1' --child clause
      and aapv.aapv_keyext1 is not null)
      or  aapv.Aapv_Area = 'LSDe' --parent clause 
      and aapv.Aapv_Area is null)

我希望输出结果是aapv_keyext1值找到任何结果,则根本不使用appv_area,但是上面的代码只使用了child子句,或者如果我删除了is null子句,则两者都使用

1 个答案:

答案 0 :(得分:0)

好的,您需要为我们提供更多信息,以便为您提供真实的答案,但我想指出的是,本节存在一些逻辑问题:

and ((aapv.Aapv_Keyext1 = 'LaD1' --child clause
and aapv.aapv_keyext1 is not null)
or  aapv.Aapv_Area = 'LSDe' --parent clause 
and aapv.Aapv_Area is null)

第一部分是说aapv_keyext1 = 'LaD1' AND aapv_keyext1 is not null;后半部分永远不能为假,因此是多余的。第二部分说aapv_area = 'LSDe' AND aapv_area is null。这将永远是不正确的。因此,整个部分等效于:

and (aapv.aapv_keyext1 = 'LaD1')

可能不是您想要的。您说要“如果aapv_keyext1值找到任何结果,则根本不使用appv_area”。我怀疑您的意思是“如果在任何行中存在aapv_keyext1 的任何结果,则不要使用aapv_area”,这更加复杂,您需要一个子查询(或分析/聚合函数)来查看其他行在做什么。

select 1, 
         aapv.aapv_keyext1,
         aapv.aapv_area,
         aapv.aapv_valuecharmax,
         aapv.aapv_valuechardefault,
       aapv.aapv_valuecharmin, aap.aap_ident
   from a_parameter_value aapv,
        a_parameter aap
  where aap.aap_ident in  (string1,string2,string3)
    and aap.aap_ref              = aapv.aap_ref
    and aap.aap_idento = string4
    and (-- prefer keyext1
         aapv.Aapv_Keyext1 = 'LaD1'
         OR
         -- if keyext1 doesn't find results...
         (NOT EXISTS (select 1 from a_parameter_value aapv2
                     where aapv2.aap_ident = aap.aap_ident
                       and aap2.aap_ref = aap.aap_ref
                       and aap2.aap_idento = aap.aap_idento
                       and aapv.Aapv_Keyext1 = 'LaD1')
          AND
          -- ... use aapv_area
          aapv.Aapv_Area = 'LSDe')
        );

您还可以使用CASE语句执行这种条件逻辑,但是如果您希望逻辑依赖于当前查看的行以外的行中的值,那么仍然需要子查询或其他查询。 / p>

如果我误解了您的问题,请告诉我,我将尝试以更好的答案进行更新。