我有一个表,其中包含特定模式中存在的所有表的详细信息。表的名称是"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
作为不正确的第一行。
有没有办法获取最近的表名?请帮我解决这个问题
答案 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;