ORACLE / SQL:列名中的通配符

时间:2018-11-22 18:36:25

标签: sql oracle

我有一个表,其中列名以通配符开头。因此,其中一列名为_Test_

如何访问此列?

select _TEST_ from Table

引发错误,以及

select * 
from Table 
where _TEST_ = 123

我尝试使用[_TEST_]\_TEST\_使用“转义”的建议,但是没有任何效果。我不能改变桌子。

EDIT(感谢@Alex Poole):select * from Table Where "_TEST_"=123可以工作。但是select "_TEST_" from Table没有。

1 个答案:

答案 0 :(得分:7)

下划线只是like pattern-matching condition的通配符。在您尝试使用它的上下文中,它不是通配符。列名仅包含一个下划线。

Database Object Names and Qualifiers上的文档显示了对象名称的规则,包括规则6:

  

未加引号的标识符必须以数据库字符集中的字母字符开头。带引号的标识符可以以任何字符开头。

由于您的列名以下划线开头,因此在创建表时,必须使用带引号的标识符定义该列,例如:

create table your_table (test number, "_Test_" number);

您可以在数据字典中看到每一列的确切名称:

COLUMN_NAME                   
------------------------------
TEST
_Test_

如果一列(或任何对象)遵循非引用标识符规则,则该列将以大写形式记录在数据字典中,但是在任何情况下都可以不带引号引用它。所以这些都是有效的:

select * from your_table where TEST = 123;
select * from your_table where Test = 123;
select * from your_table where test = 123;
select * from your_table where tEsT = 123;

但是,如果要使用带引号的标识符,则在引用它时总是必须使用引号,并且大小写完全相同。所以这些错误:

select * from your_table where _TEST_ = 123;
select * from your_table where _Test_ = 123;
select * from your_table where "_TEST_" = 123;

(由于大小写不同,前两个带有ORA-00911: invalid character,第三个带有ORA-00904: "_TEST_": invalid identifier)。您必须完全匹配,因此只有这样才有效:

select * from your_table where "_Test_" = 123;

这就是为什么加引号的标识符很麻烦,应尽可能避免使用。 Oracle甚至建议不要使用它们。