Oracle查询中表名的正则表达式

时间:2014-11-11 09:42:28

标签: sql oracle

我正在尝试搜索使用混合字母(上/下)导入的表格,因此我使用的是正则表达式。但是,这不是正确的语法。有没有办法在Oracle中实现这个?

可能的表名:

my_TablEnaME_20140501
MY_TablEnaME_20140501
MY_TABLENAME_20140501

SELECT * FROM REGEXP_LIKE(my_TablEnaME_20140502, '[a-zA-Z]', 'i')

问题出在我搜索时:

SELECT * FROM step_factor_20120903
WHERE REGEXP_LIKE(jobDateClosed, '[a-z]+.?[A-Z]+|[A-Z]+.?[a-z]', 'c');

Error at Command Line : 121 Column : 15
Error report -
SQL Error: ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

但如果我用引号搜索,例如:

SELECT * FROM "step_factor_20120903"
WHERE REGEXP_LIKE("jobDateClosed", '[a-z]+.?[A-Z]+|[A-Z]+.?[a-z]', 'c');

我得到了结果。

我想要实现的是不必使用引号,因为代码需要是动态的并且处理表的任何命名约定。

2 个答案:

答案 0 :(得分:3)

考虑到Oracle名称不区分大小写,除非它们是双引号("这就是SQL标准要求标识符被处理的方式")。

此查询将搜索包含小写和大写字母的名称(只能找到双引号,其他字母以大写形式存储):

SELECT * FROM ALL_TABLES 
WHERE REGEXP_LIKE(TABLE_NAME, '[a-z]+.?[A-Z]+|[A-Z]+.?[a-z]+', 'c');

ALL_TABLES包含用户具有任何权限的表

USER_TABLES包含用户拥有的表

[A-Z]+至少一个大写字母

.?任何符号0次或更多次

| =或

总结:

  

在SQL语句中,您表示带引号的对象的名称   标识符或非引用标识符。    - 带引号的标识符以双引号(")开头和结尾。 如果使用带引号的标识符命名架构对象,则必须使用   每次引用该对象时都使用双引号。    - 未加引号的标识符不会被任何标点符号包围。

表名存储在USER_TABLES中,不带引号。例如:

  • name" MyTab"存储为MyTab
  • 名称MyTab存储为MYTAB

为了检索所有"正确的"来自USER_TABLES的表名,您可以使用此查询:

select '"' || table_name || '"' from user_tables;

因为Oracle认为" MYTAB"和MYTAB相同。

或者您可以使用此查询(但它只会找到包含小写字母的引用名称,而不是所有引用的名称):

select case when regexp_like(table_name, '[a-z]', 'c') then '"' || table_name || '"'
else table_name end
from user_tables;

答案 1 :(得分:0)

如果要选择或搜索这些表的内容,则需要动态SQL!

通常不需要正则表达式,因为默认情况下Oracle不区分大小写。

否则,您需要在PLSQL中使用两步解决方案:

DECLARE
  l_variable1 VARCHAR2(30);
  l_tab       record_table; -- Has to be properly defined on the column-types
BEGIN
  SELECT TABLE_NAME INTO variable1
    FROM ALL_TABLES WHERE LOWER(TABLE_NAME) = LOWER('name_from_csv');
  EXECUTE IMMEDIATE( 'SELECT * FROM "' || l_variable1 || '";' ) INTO l_tab;
END;