web-dev-qa-db-ja.com

PostgreSQLで列をスペースで引用していますか?

SQL ServerからPostgreSQLにデータベースを移行しました。

ほとんどの列名にはダブルワードが含まれています。次に例を示します。

SELECT [Column Name] FROM table;

...これはPostgreSQLでは機能しません。

PostgreSQLの正しい構文は何ですか?

9
A Chang

ほとんどの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';

二重引用符を使用する場合、大文字と小文字も重要であることに注意してください。 (二重引用符が使用されていない場合、Postgresはすべてを小文字にします... Oracleはすべて大文字にします。)

SELECT COLUMN1 FROM TABLE

postgresでは、とは異なります

SELECT "COLUMN1" FROM TABLE

oracleのように、とは異なります

SELECT "column1" FROM TABLE
20
Joishi Bodio

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:]]';

そこから、実行するコマンドを編集したり、不要なコマンドを削除したり、\gexecを実行したりして問題をすべて解消できます。

3
Evan Carroll