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

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

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'

Фактически я ищу записи из table1 для value1 или value2, но для записей, соответствующих значению 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

Вы нашли ответ, который искали? Если да, не могли бы вы выбрать ответ и пометить его как принятый?

Hosam Aly 27.01.2009 10:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
21 322
4

Ответы 4

Я думаю, что операторы 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')

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

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

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

Это не достигает той же цели. Этот запрос не будет выдавать значения, где a.cola2 = 'valuea1', если внутреннее соединение не завершится успешно. Проверьте мое решение на наличие альтернатив.

Hosam Aly 09.01.2009 14:48

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

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

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' )

Другие вопросы по теме