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

Newbie question: Code line ends with column name null. How to add comment at the end of this line?

下面我们进行简单的查询。

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 时遇到的一个问题是,如果您在声明 FROM table 之前添加注释,它会破坏语法并引发错误 "Expecting FROM keyword"。因此,我建议您将评论移至 after 您的 FROM table 语句,或使用 /* 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 fiddle: http://sqlfiddle.com/#!4/7dd91d/19

并且由于您标记了 oracle,

来源:https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/comment.htm#LNPLS01308

让我们将问题剥离到最低限度并删除 UNION,其他列并使用 DUAL table:

SELECT DUMMY -- comment
FROM DUAL;

这输出:

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

语句引用了 table 中的列,因此列名将用作语句输出中的别名。

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

SELECT NULL -- comment
FROM   DUAL;

这将输出:

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

并且 Oracle 将从 SQL 语句的文本生成列名,输出中列的别名将是 SELECT 和 [=23] 之间的查询文本=] 关键字,因此名称将是 NULL -- comment,去掉空格。

所以 SELECT NULL FROM DUAL 会有一个列名 NULL

具有其他文字值的稍微复杂的版本:

SELECT NULL --comment here
       , NULL /* other comment */,
       'LITERAL' -- third comment
       , 0 /* fourth comment */
FROM   DUAL

None 生成的列引用了 table 的命名列,因此 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 |

并且使用了别名并且忽略了注释。