【问题标题】:Unable to select recent table name from all_tables table无法从 all_tables 表中选择最近的表名
【发布时间】:2016-06-22 12:50:59
【问题描述】:

我有一个表,其中包含特定模式中存在的所有表的详细信息。表的名称是"all_tables"。有一个名为table_name 的列,其中包含所有表的名称。

我有一个名为"SBC_RAO_INDEX_30_05_2016_04_99" 的表。这里"30_05_2016_04_99" 是带有时间戳的日期。 同样,我有不同时间戳的表格,如下所示。

  SBC_RAO_INDEX_30_05_2016_04_99,
  SBC_RAO_INDEX_31_05_2016_04_99,
  SBC_RAO_INDEX_01_06_2016_04_99,
  SBC_RAO_INDEX_02_06_2016_04_99,
  SBC_RAO_INDEX_03_06_2016_04_99

我正在尝试使用以下查询从 all_tables 中获取最新的表名:

select * 
from all_tables 
WHERE table_name like 'SBC_RAO_INDEX%' 
and table_name not like 'SBC_RAO_INDEX_BKP%' 
order by table_name desc 

但是这个查询给了我SBC_RAO_INDEX_31_05_2016_04_99 作为第一行这是不正确的。

有没有办法获取最近的表名?请帮我解决这个问题

【问题讨论】:

    标签: oracle oracle11g oracle10g toad


    【解决方案1】:

    试试这个。希望对您有所帮助。

    SELECT
      A.*
    FROM
      (
        SELECT
          'SBC_RAO_INDEX_30_05_2016_04_99' AS fle
        FROM
          DUAL
        UNION ALL
        SELECT
          'SBC_RAO_INDEX_31_05_2016_04_99' AS fle
        FROM
          DUAL
        UNION ALL
        SELECT
          'SBC_RAO_INDEX_01_06_2016_04_99' AS fle
        FROM
          DUAL
        UNION ALL
        SELECT
          'SBC_RAO_INDEX_02_06_2016_04_99' AS fle
        FROM
          DUAL
        UNION ALL
        SELECT
          'SBC_RAO_INDEX_03_06_2016_04_99' AS FLE
        FROM
          DUAL
      )
      A
    ORDER BY
      TO_DATE(REPLACE(SUBSTR(A.FLE,15,10),'_','/'),'DD/MM/YYYY') DESC;
    

    【讨论】:

      【解决方案2】:

      因为在 LIKE 中 '_' 是一个特殊字符, 改用 SUBSTR:

      SELECT *
        FROM all_tables
       WHERE SUBSTR(table_name,1,13) ='SBC_RAO_INDEX'
         AND SUBSTR(table_name,15,3) <> 'BKP'
       ORDER BY table_name DESC
      

      【讨论】:

        【解决方案3】:

        由于下划线是 LIKE 的特殊字符并且它匹配任何单个字符,因此通过定义这样的转义字符(您需要为每个 LIKE 使用 ESCAPE 子句)将其转义以匹配文字下划线,然后将该字符紧挨在前面下划线:

        select * 
        from all_tables 
        WHERE table_name like 'SBC\_RAO\_INDEX%' ESCAPE '\'
        and table_name not like 'SBC\_RAO\_INDEX\_BKP%' ESCAPE '\'
        order by table_name desc;
        

        请注意,您仍然可以使用下划线来匹配同一字符串中的单个字符,只需在需要匹配文字下划线时将其转义即可。

        【讨论】:

          【解决方案4】:

          感谢您的回答。 下面的查询满足了我的要求。

          从 all_tables WHERE 中选择 table_name table_name like 'SBC_RAO_INDEX_%' 和 table_name 不像 'SBC_RAO_INDEX_BKP%' 按 T​​O_DATE(SUBSTR(table_name,15,10),'DD/MM/YYYY') DESC;

          排序

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-06-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-08
            • 1970-01-01
            • 2020-10-21
            • 1970-01-01
            相关资源
            最近更新 更多