Вопрос новичка: строка кода заканчивается именем столбца null.Как добавить комментарий в конце этой строки? - PullRequest
0 голосов
/ 10 сентября 2018

Ниже у нас есть простой запрос.

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 голосов
/ 10 сентября 2018

Позволяет обрезать вопрос до минимума, убрать 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, разделенного запятыми.

Оператор SQL с UNION будет принимать имена столбцов из первого предложения 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 |

и псевдонимы используются, а комментарии были проигнорированы.

0 голосов
/ 10 сентября 2018

Одна проблема, с которой я столкнулся в Oracle, заключается в том, что если вы добавите комментарий перед указанием ИЗ таблицы , он нарушит синтаксис и выдаст ошибку "Ожидается ключевое слово FROM" . Поэтому я бы посоветовал вам переместить комментарий на после вашего ОТ таблицы оператора, либо использовать /* comment */, либо добавить многострочный комментарий в какой-то момент, давая больше в подробное объяснение вместо добавления комментария непосредственно к оператору выбора.

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

А так как вы пометили оракула,

источник: https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/comment.htm#LNPLS01308

...