无法从all_tables表

时间:2016-06-22 12:50:59

标签: oracle oracle11g oracle10g toad

我有一个表,其中包含特定模式中存在的所有表的详细信息。表的名称是"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作为不正确的第一行。

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

4 个答案:

答案 0 :(得分:0)

试试这个。希望它有所帮助。

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;

答案 1 :(得分:0)

因为喜欢' _'是一个特殊的角色, 改为使用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

答案 2 :(得分:0)

由于下划线是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;

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

答案 3 :(得分:0)

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

从all_tables WHERE中选择table_name table_name喜欢'SBC_RAO_INDEX_%' 和table_name不喜欢'SBC_RAO_INDEX_BKP%' 按TO_DATE排序(SUBSTR(table_name,15,10),'DD / MM / YYYY')DESC;