Хорошо, вам нужно предоставить больше информации, чтобы мы могли дать вам реальный ответ, но я хотел бы отметить, что в этом разделе есть некоторые логические проблемы:
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, но вам все равно понадобится подзапрос или что-то еще, если вы хотите, чтобы ваша логика зависела от значений встроки, отличные от той, которая просматривается в данный момент.
Дайте мне знать, если я неправильно понял ваш вопрос, и я постараюсь обновить с лучшим ответом.