在 PostgreSQL 中引用带有空格的列?

A C*_*ang 11 postgresql syntax

我将数据库从 SQL Server 迁移到 PostgreSQL。

大多数列名包含双字,例如:

SELECT [Column Name] FROM table;
Run Code Online (Sandbox Code Playgroud)

...这在 PostgreSQL 中不起作用。

PostgreSQL 的正确语法是什么?

Joi*_*dio 25

在大多数 RDBMS 中,双引号用于指定某些内容的确切拼写..(单引号是字符串分隔符)。

SELECT
  tab."This IS My Column EXACTLY" AS col
FROM "My TabLE Name Contains Spaces Too!" tab
WHERE tab."ANOTHER UGLY COLUMN name" = 'MyFilterString';
Run Code Online (Sandbox Code Playgroud)

请注意,大写/小写在使用双引号时也很重要。(当不使用双引号时,Postgres 将所有内容都小写……Oracle 大写,等等。)

SELECT COLUMN1 FROM TABLE
Run Code Online (Sandbox Code Playgroud)

在 postgres 中,不同于

SELECT "COLUMN1" FROM TABLE
Run Code Online (Sandbox Code Playgroud)

在 oracle 中,不同于

SELECT "column1" FROM TABLE
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 5

转向 PostgreSQL 约定

有关更多信息,请参阅文章如何在旧数据库中采用 PostgreSQL 命名约定?

在 PostgreSQL 中,按照惯例并且有充分的理由,我们在标识符(列、表、模式等)中既不使用空格也不使用大写字母。虽然使用_纯粹是风格。

SELECT FORMAT(
  'ALTER TABLE %I.%I.%I RENAME %I to %I;',
  table_catalog,
  table_schema,
  table_name,
  column_name,
  lower(
    -- replace all spaces with _, xX and Xx becomes x_x
    regexp_replace(
      -- First, replace spaces with an _
      replace(column_name, ' ', '_'),
      '([[:lower:]])([[:upper:]])',
      '\1_\2',
      'xg'
    )
  )
)
FROM information_schema.columns
WHERE column_name ~ ' |[[:lower:]][[:upper:]]';
Run Code Online (Sandbox Code Playgroud)

从那里你可以编辑要运行的命令,删除你不想要的命令,或者运行\gexec,所有的问题都会消失。