【问题标题】:Match columns 1 if data not found then search column 2 oracle query如果未找到数据,则匹配第 1 列,然后搜索第 2 列 oracle 查询
【发布时间】: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


    【解决方案1】:

    这是一个涉及 OR 表达式的典型 SQL 选择语句。

    SELECT * from TABLE WHERE Col1 = '123' or Col2 = 'ABC';
    

    【讨论】:

      【解决方案2】:

      您需要满足第一个条件的所有行 - 但如果没有匹配的行,那么您需要满足第二个条件的所有行。

      我会用一个行限制子句来解决这个问题(从 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 更有效,因为它不需要对表进行两次扫描。

      【讨论】:

        【解决方案3】:

        您可以将existsunion 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);
        

        【讨论】:

          【解决方案4】:

          如果您希望只有一行,您可以使用:

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

          【讨论】:

            猜你喜欢
            • 2015-11-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-10
            • 2021-02-04
            • 2019-06-16
            相关资源
            最近更新 更多