Сопоставить столбцы 1, если данные не найдены, тогда поиск столбца 2 oracle запрос - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь найти способ, если данные не найдены на основе столбца col1 таблицы, затем выполните поиск с другим значением столбца

SELECT * FROM TABLE
WHERE COL1='123'

IF NULL
THEN 

SELECT * FROM TABLE 
WHERE COL2='ABC';

Спасибо

Ответы [ 4 ]

1 голос
/ 06 мая 2020

Вы хотите, чтобы все строки удовлетворяли первому условию, но если ни одна строка не соответствует, тогда вы хотите, чтобы все строки удовлетворяли второму условию.

Я бы адресовал это с помощью предложения об ограничении строк (доступно начиная с версии 12 c):

select *
from mytable 
where 'ABC' in (col1, col2)
order by rank() over(order by case col1 = 'ABC' then 1 else 2 end)
fetch first 1 row with ties

Это более эффективно, чем union all, потому что не требует двух сканирований таблицы.

1 голос
/ 06 мая 2020

Это типичный SQL оператор select, включающий выражение OR.

SELECT * from TABLE WHERE Col1 = '123' or Col2 = 'ABC';
0 голосов
/ 06 мая 2020

Если вы ожидаете только одну строку, вы можете использовать:

SELECT t.*
FROM TABLE t
WHERE COL1 = '123' OR COL2 = 'ABC'
ORDER BY (CASE WHEN COL1 = '123' THEN 1 ELSE 2 END)
FETCH FIRST 1 ROW ONLY;

С несколькими возможными строками в результирующем наборе, я бы go для:

SELECT t.*
FROM TABLE t
WHERE COL1 = '123' OR
      (COL2 = 'ABC' AND
       NOT EXISTS (SELECT 1 FROM TABLE t2 WHERE t2.COL1 = '123');
0 голосов
/ 06 мая 2020

Вы можете использовать exists с union all:

select t.*
from table t
where col1 = 123 union all
select t.*
from table t
where col2 = 'abc' and
      not exists (select 1 from table t1 where t1.col1 = 123);
...