【发布时间】:2020-05-06 09:23:22
【问题描述】:
如果根据表的 col1 找不到数据,我正在尝试找到一种方法,然后使用其他列值进行搜索
SELECT * FROM TABLE
WHERE COL1='123'
IF NULL
THEN
SELECT * FROM TABLE
WHERE COL2='ABC';
谢谢
【问题讨论】:
标签: sql oracle select where-clause
如果根据表的 col1 找不到数据,我正在尝试找到一种方法,然后使用其他列值进行搜索
SELECT * FROM TABLE
WHERE COL1='123'
IF NULL
THEN
SELECT * FROM TABLE
WHERE COL2='ABC';
谢谢
【问题讨论】:
标签: sql oracle select where-clause
这是一个涉及 OR 表达式的典型 SQL 选择语句。
SELECT * from TABLE WHERE Col1 = '123' or Col2 = 'ABC';
【讨论】:
您需要满足第一个条件的所有行 - 但如果没有匹配的行,那么您需要满足第二个条件的所有行。
我会用一个行限制子句来解决这个问题(从 12c 版开始可用):
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 更有效,因为它不需要对表进行两次扫描。
【讨论】:
您可以将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);
【讨论】:
如果您希望只有一行,您可以使用:
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;
如果结果集中有多个可能的行,我会选择:
SELECT t.*
FROM TABLE t
WHERE COL1 = '123' OR
(COL2 = 'ABC' AND
NOT EXISTS (SELECT 1 FROM TABLE t2 WHERE t2.COL1 = '123');
【讨论】: