Тип приведите поле, созданное на лету, используя AS "new_field" в подзапросе SELECT. - PullRequest
0 голосов
/ 01 мая 2020

Context

У меня действительно крошечная проблема при создании таблицы PostgreSQL с использованием подзапроса SELECT, где я хотел бы инициализировать поле со NULL значениями типа INTEGER (по умолчанию они TEXT, если я не указываю тип).

Достаточно разговоров, вот фрагмент кода с объяснениями фона:

CREATE TABLE my_table AS
  SELECT
    0 AS fid, -- initiate new field here, it doesn't exist in the table where the select is run on
    gid,
    min(distance) AS mindist
  FROM
    schema.points
  GROUP BY
    gid;

Это работает, как и ожидалось, у меня есть 0 везде в поле fid, которое мне нужно создать в это время.

Но я не совсем доволен 0 значений, поскольку они будут иметь важное значение в дальнейших вычислениях, поэтому я хотел бы инициализировать это поле fid значениями NULL (не волнуйтесь, это не pkey).

Поэтому я изменил это на следующее:

CREATE TABLE my_table AS
  SELECT
    NULL AS fid, -- initiate new field here, it doesn't exist in the table where the select is run on
    gid,
    min(distance) AS mindist
  FROM
    schema.points
  GROUP BY
    gid;

И оно работает хорошо!
За исключением того, что теперь это поле TEXT (похоже, это тип по умолчанию) когда используется NULL), и мне действительно нужно это как INTEGER (у меня возникают дальнейшие проблемы, если я позволю ему как TEXT).

Вопрос

Как я мог установить (то есть приведение, технически говоря) для поля fid равным NULL и типа INTEGER одновременно в данном конкретном случае запрос?

Ни одна из этих работ (я каждый раз сталкиваюсь с синтаксическими ошибками):

  • NULL AS fid::INTEGER
  • INTEGER NULL AS fid
  • NULL INTEGER AS fid

Окружающая среда

PostgreSQL 10.12

1 Ответ

1 голос
/ 01 мая 2020

Вы фактически должны установить тип приведения после нуля, используя:

CREATE TABLE my_table AS
  SELECT
    NULL::INTEGER AS fid, -- initiate new field here as a NULL INTEGER
    gid,
    min(distance) AS mindist
  FROM
    schema.points
  GROUP BY
    gid;

Тогда у вас будет это:

pgAdmin results

Результат: pgAdmin .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...