我正在尝试搜索使用混合字母(上/下)导入的表格,因此我使用的是正则表达式。但是,这不是正确的语法。有没有办法在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');
我得到了结果。
我想要实现的是不必使用引号,因为代码需要是动态的并且处理表的任何命名约定。
答案 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中,不带引号。例如:
为了检索所有"正确的"来自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;