新手问题:代码行以列名null结尾。如何在此行的末尾添加评论?

时间:2018-09-10 10:52:56

标签: sql oracle comments alias

下面我们有简单的查询。

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

  • 在评论前使用--还是/* */都没关系。

我很好奇这是什么原因?

2 个答案:

答案 0 :(得分:4)

让问题降至最低限度并删除UNION,其他列并使用DUAL表:

SELECT DUMMY -- comment
FROM DUAL;

这将输出:

| DUMMY |
|-------|
|     X |

该语句引用表中的一列,因此该列的名称将用作该语句输出中的别名。

但是,如果我们不引用列而是使用文字:

SELECT NULL -- comment
FROM   DUAL;

这将输出:

| NULL--COMMENT |
|---------------|
|             X |

,Oracle将根据SQL语句的文本生成列名,输出中该列的别名将是SELECTFROM关键字之间的查询文本,因此该名称将会是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