我有一个表,其中列名以通配符开头。因此,其中一列名为_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
没有。
答案 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甚至建议不要使用它们。