Я пытаюсь сделать следующий код меньше. Это возможно?
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


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