SQL: условие If в предложении where

#sql #oracle

#sql #Oracle

Вопрос:

Я хочу проверить, есть ли в таблице A какая-либо запись, тогда в таблице B присутствует ТОЛЬКО значение столбца check table A. Если в TableA нет данных, тогда просто получите данные из TableB.

Я хочу иметь предложение Exists для запроса TableB select тогда и только тогда, когда в таблице есть данные, иначе это будет просто запрос select для TableB

Внутреннее соединение не будет работать, поскольку существует вероятность того, что в TableA не будет никаких данных, даже левого соединения.

Как мне сделать это в одном запросе?

что-то вроде этого :

 select Id from TableB where 
if( select count(*) from TableA ) > 0 then Id in (select col from TableA)
  

Комментарии:

1. что? Я не могу понять. оно слишком расплывчатое.

2. Что вы хотите сделать, если таблица A не пуста?

3. поправьте меня, если я неправильно понимаю, вы хотите проверить таблицу A на наличие записи, если да, то вы отобразите записи, имеющие отношение в таблице A и таблице B? а если записей нет? что произойдет? оно просто отобразит все записи таблицы B или ничего не отобразит? потому что, если вы просто хотите найти, есть ли в таблице A запись, связанная с таблицей B, просто используйте Join, и она получит записи для вас..

4. @wrecklez: Ваше понимание верно. проверьте таблицу A, есть ли запись, если да, вы отобразите записи, имеющие отношение в таблице A и таблице B. Если записей нет, то будут просто отображены все записи таблицы B.

5. @user1049021 можете ли вы посмотреть, поможет ли вам мой обновленный ответ?

Ответ №1:

 select b.* from tableB b, tableA A
Where b.id = a.id
  

для этого достаточно простого соединения.

Используется другой способ EXISTS . И поместите в него свои условия.

 select * from tableB b
Where exists
(Select 'x' from tableA a 
 Where a.id=b.id)
  

Редактировать:

надеюсь, вам это нужно.

 /* first part returns result only when tableA has data */
select b.* from tableB b, tableA A
Where b.id = a.id
Union
/* Now we explicitly check for presence of data in tableA,only 
    If not we query tableB */
Select * from tableB 
Where not exists (select 'x' from tableA)
  

таким образом, только одна часть запроса вернет результат, являющийся тем же самым результирующим набором, UNION операция set, которая могла бы выполнить это.

Если вам вообще нужны результаты на основе условий, PL / SQL может быть отличным выбором!

 VARIABLE MYCUR REFCURSOR;
/* defines a ref cursor in SQL*Plus */

DECLARE
  V_CHECK NUMBER;
BEGIN
   SELECT COUNT(*) INTO V_CHECK
   FROM TABLEA;

   IF(v_CHECK > 0) THEN
     OPEN :MYCUR FOR
        select b.* from tableB b, tableA A
        Where b.id = a.id;
   ELSIF
     OPEN :MYCUR FOR
       select * from tableB;
   END IF;
END;
/
/* prints the cursor result in SQL*Plus*/
print :MYCUR
  

Ответ №2:

 select b.id
from table_a a
,    table_b b
where a.col = b.id
and a.col_val = 'XXX';
  

Ответ №3:

я думаю, это может вам помочь, но я знаю, что это не лучший ответ, в моем собственном понимании вы хотите всегда отображать свои записи Table B и проверять TableA , есть ли у записи их связи, но я думаю, что не нужно учитывать, есть ли у вас запись в Table A или нет, если вы используете LEFT JOIN и ставите какое-либо условие для фильтрации вот мой пример…

в этом запросе будут отображены все данные из TableB , независимо от того, имеют ли они отношение в TableA или нет, если имеют TableA и TableB имеют отношение, это вернет значение, основанное на отношении, но если запись в TableB не имеет отношения в TableA , она вернет null значение, в этом случае вы можете использовать WHERE для фильтрации того, что вы хотите

 SELECT * FROM TableB B
LEFT JOIN Table A ON A.id = B.id
  

если вы просто хотите отобразить все записи TableB со связью в TableA , добавьте это

 WHERE NVL(A.id,0) > 0