下面我们有简单的查询。
select job_id, employee_id, null --comment here
from employees
union all
select job_id, employee_id, end_date
from job_history
order by 2
当我尝试在第一行末尾写一些评论时, 注释成为列别名的一部分。
此示例的结果是第三列的列名,如下所示:
NULL--COMMENTHERE
在评论前使用--
还是/* */
都没关系。
我很好奇这是什么原因?
答案 0 :(得分:4)
让问题降至最低限度并删除UNION
,其他列并使用DUAL
表:
SELECT DUMMY -- comment
FROM DUAL;
这将输出:
| DUMMY |
|-------|
| X |
该语句引用表中的一列,因此该列的名称将用作该语句输出中的别名。
但是,如果我们不引用列而是使用文字:
SELECT NULL -- comment
FROM DUAL;
这将输出:
| NULL--COMMENT |
|---------------|
| X |
,Oracle将根据SQL语句的文本生成列名,输出中该列的别名将是SELECT
和FROM
关键字之间的查询文本,因此该名称将会是NULL -- comment
,其中的空格会被删除。
因此SELECT NULL FROM DUAL
的列名称为NULL
。
带有其他文字值的稍微复杂的版本:
SELECT NULL --comment here
, NULL /* other comment */,
'LITERAL' -- third comment
, 0 /* fourth comment */
FROM DUAL
所有生成的列均未引用表的命名列,因此Oracle将根据SQL生成名称并输出:
| NULL--COMMENTHERE | NULL/*OTHERCOMMENT*/ | 'LITERAL'--THIRDCOMMENT | 0/*FOURTHCOMMENT*/ |
|-------------------|----------------------|-------------------------|--------------------|
| (null) | (null) | LITERAL | 0 |
,您会看到列名是从SQL语句select子句列表生成的,以逗号分隔。
带有UNION
的SQL语句将从第一个SELECT
子句(在UNION
之前)获取列名,因此:
SELECT NULL -- comment
FROM DUAL
UNION ALL
SELECT DUMMY
FROM DUAL;
输出:
| NULL--COMMENT |
|---------------|
| (null) |
| X |
列名将来自第一个引用列的语句,而不是第二个(在UNION
之下)。
如果要覆盖默认的列名,请使用别名:
SELECT NULL "NULL" --comment here
, NULL AS other /* other comment */,
'LITERAL' AS literal -- third comment
, 0 AS "0" /* fourth comment */
FROM DUAL
输出:
| NULL | other | LITERAL | 0 |
|--------|--------|---------|---|
| (null) | (null) | LITERAL | 0 |
和使用别名,并且注释已被忽略。
答案 1 :(得分:1)
我在Oracle中遇到的一个问题是,如果您在声明 FROM表之前添加注释,则会破坏语法并引发错误“ Expecting FROM keyword” 。因此,我建议您将注释移到 FROM表语句的之后,或使用/* comment */
或在某个时候添加多行注释,提供更深入的解释,而不是直接将注释添加到select语句中。
select job_id, employee_id, null --comment here
from employees
union all
select job_id, employee_id, end_date
from job_history
order by 2
上面的代码来自您的问题,并且破坏了Oracle语法。
select job_id, employee_id, null from employees -- comment here
union all
select job_id, employee_id, end_date
from job_history
order by 2
这有效。
SQL提琴:http://sqlfiddle.com/#!4/7dd91d/19
由于您标记了oracle,
来源:https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/comment.htm#LNPLS01308