Игнорировать предложения, в которых основано, если вы получаете результат от выбора - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу, чтобы следующий оператор sql дал мне разные результаты в зависимости от того, находит ли он результат в определенной строке или ему необходим поиск по всей родительской группе (поэтому в таблице есть, например:

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

, поэтому, если он может найти результат, если я поставлю 1, он покажет мне

 a -1
 b -1 

. Проблема в том, что в предложении where существуют обе родительские группыи дочерняя группа

я пытался использовать case, а также имитировать if с ands и ors, но это не сработало

  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 вообще не используется, но либо с дочерним кодом используется только дочернее предложение, либо и то и другое, если я удаляю нулевое предложение

1 Ответ

0 голосов
/ 07 февраля 2019

Хорошо, вам нужно предоставить больше информации, чтобы мы могли дать вам реальный ответ, но я хотел бы отметить, что в этом разделе есть некоторые логические проблемы:

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, но вам все равно понадобится подзапрос или что-то еще, если вы хотите, чтобы ваша логика зависела от значений встроки, отличные от той, которая просматривается в данный момент.

Дайте мне знать, если я неправильно понял ваш вопрос, и я постараюсь обновить с лучшим ответом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...