Могу ли я присоединиться к таблице в ORACLE (10g), используя предложение CASE в операторе ON (или даже предложение where, поскольку это внутреннее соединение) - PullRequest
1 голос
/ 09 января 2009

Я пытаюсь сделать следующий код меньше. Возможно ли это?

select a.*
from table1 a
WHERE a."cola1" = 'valuea1'
UNION ALL
select a.*
from tablea1 a
inner join tablea2 b on a."cola2" = b."colb2"
WHERE a."cola1" = 'valuea2'
  and b."colb3" = 'valueb3'

По сути, я ищу записи из таблицы1 для значения1 или значения2, но для записей, соответствующих значению2, я хочу применить 1 дополнительное условие, которое включает соединение со второй таблицей Можно ли это сделать без предложения UNION?

Ниже приведен скелет или то, что я пытаюсь закодировать ... но он не работает естественным образом.

select a.*
from table1 a
inner join table2 b on a."cola1" = b."COLb1"
WHERE a."cola2" IN ('valuea1','valuea2')
  and 
  CASE 
    WHEN a."cola2" = 'valuea2' THEN b."colb1" = 'valueb3'
    ELSE 1=1
  END CASE

Ответы [ 4 ]

5 голосов
/ 09 января 2009

Я думаю, что CASE операторы работают в условиях соединения, но я не уверен. Но сработает ли это для вас?

select *
  from table1 a
 where a.cola1 = 'valuea1'
    or (a.cola1 = 'valuea2'
        and Exists(select 1
                     from table2 b
                    where a.cola2 = b.colb2
                      and b.colb3 = 'valueb3'
                   )
        )

Редактировать: Разве это не сработает?

select a.*
  from table1 a
  Left Outer Join table2 b On (a.cola2 = b.colb2)
 where a.cola1 = 'valuea1'
    or (a.cola1 = 'valuea2' and b.colb3 = 'valueb3')
4 голосов
/ 09 января 2009

В целом, вы должны следовать предложению Хосама полностью переписать предикат. Но для дальнейшего объяснения исходной проблемы проблема заключается в том, что в SQL CASE .. END является выражением и может использоваться только там, где можно использовать любое другое выражение. Условие типа «a = b» - это два выражения, соединенные логическим оператором. Возможно, вы захотите думать о нем как о логическом выражении, но это не так, как SQL это видит.

Вы можете выполнить то, что хотите, с помощью CASE, используя его как одно из двух выражений в условии, например:

WHERE a."cola2" IN ('valuea1','valuea2')
  and 
  b."colb1" = CASE 
                WHEN a."cola2" = 'valuea2' THEN 'valueb3'
                ELSE b."colb1"
              END CASE

(Если для colb1 возможно включить NULL, вам необходимо изменить его для обработки.)

0 голосов
/ 07 декабря 2016

Вы можете достичь этого, используя левое соединение и где условие

select a.*
from table1 a
left join tablea2 b on a."cola2" = b."colb2"
WHERE a."cola1" = 'valuea2'
  and ( b."colb2" is null or b."colb3" = 'valueb3' )
0 голосов
/ 09 января 2009

ОП: У меня есть мини-обходной путь, который подходит близко (Это может работать только при условии, что это внутреннее соединение.)

выберите. * Из таблицы1 таблица внутреннего соединения2 b на a. "cola1" = b. "COLb1" ГДЕ (a. "cola2" = 'valuea1') ИЛИ (a. "Cola2" = 'valuea2' и b. "Colb1" = 'valueb3')

Иногда написание кода может подсказать альтернативное мышление. Самостоятельная терапия. Спасибо за ваш вклад.

...