我希望下面的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子句,则两者都使用
答案 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>
如果我误解了您的问题,请告诉我,我将尝试以更好的答案进行更新。