Как ссылаться на столбец с неявным именем в DB2 - PullRequest
2 голосов
/ 07 мая 2019

В DB2 LuW я выполняю следующий запрос

db2 => select 'a', 'b' from sysibm.dual

1 2
- -
a b

  1 record(s) selected.

Обратите внимание, что сгенерированные "имена столбцов" являются индексами столбцов, начинающимися с 1. Теперь, если у меня есть такой запрос как производная таблица, я не могу просто ссылаться на имена столбцов по их индексу следующим образом:

db2 => select t."1", t."2" from (select 'a', 'b' from sysibm.dual) t
SQL0206N  "T.1" is not valid in the context where it is used.  SQLSTATE=42703

Несмотря на то, что псевдонимы числовых столбцов возможны, это работает:

db2 => select t."1", t."2" from (select 'a' as "1", 'b' as "2" from sysibm.dual) t

1 2
- -
a b

  1 record(s) selected.

Или, используя списки производных столбцов:

select t."1", t."2" from (
  select 'a', 'b' from sysibm.dual
) t("1", "2")

Можно ли ссылаться на сгенерированные имена / индексы столбцов, не изменяя исходный запрос и не заключая его в производную таблицу (что может иметь побочные эффекты, такие как потеря порядка)?

Обратите внимание, что исходный запрос может не находиться под моим контролем, поскольку это обеспечивается какой-то другой логикой. Например, в контексте jOOQ

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Вы не можете ссылаться на безымянные (с именем, сгенерированным системой) столбцы в Db2.

0 голосов
/ 07 мая 2019

Я думаю, JOOQ великолепен.У нас есть другой ORM, который производит живой SQL, и мы столкнулись с той же проблемой.В итоге мы разделили классы Java на два совершенно разных SELECT s:

  • General SELECT .Принимает "столбцы" и "именованные столбцы".
  • Полностью именованный SELECT .Принимает только «именованные столбцы».

По сути, наш API обеспечивает использование второго в некоторых подзапросах (например, CTE), поэтому пользователи вынуждены использовать столбцы таблицы / представления (именованные по определению).), или принудительно добавьте псевдонимы для любых создаваемых ими свободных выражений.

Таким образом, любой внешний запрос всегда может извлечь столбцы подзапроса по их имени.

Я пытался сделать это в SQL, но не могне находит никакого стандартного способа SQL для извлечения безымянных столбцов подзапроса.

...