web-dev-qa-db-fra.com

Citer des colonnes avec des espaces dans PostgreSQL?

J'ai migré une base de données de SQL Server vers PostgreSQL.

La plupart des noms de colonnes contiennent des mots doubles, par exemple:

SELECT [Column Name] FROM table;

... qui ne fonctionne pas dans PostgreSQL.

Quelle est la syntaxe correcte pour PostgreSQL?

9
A Chang

Dans la plupart des SGBDR, les guillemets doubles sont utilisés pour spécifier l'orthographe exacte de quelque chose .. (les guillemets simples étant des délimiteurs de chaîne).

SELECT
  tab."This IS My Column EXACTLY" AS col
FROM "My TabLE Name Contains Spaces Too!" tab
WHERE tab."ANOTHER UGLY COLUMN name" = 'MyFilterString';

Notez que les majuscules/minuscules sont également importantes lors de l'utilisation de guillemets doubles. (Postgres tout en minuscules lorsque les guillemets doubles ne sont pas utilisés ... tout en majuscules Oracle, etc.)

SELECT COLUMN1 FROM TABLE

en postgres, est différent de

SELECT "COLUMN1" FROM TABLE

où comme dans Oracle, est différent de

SELECT "column1" FROM TABLE
20
Joishi Bodio

Passer à la convention PostgreSQL

Pour plus d'informations à ce sujet, consultez l'article Comment puis-je adopter la convention de dénomination PostgreSQL dans la base de données héritée?

Dans PostgreSQL par convention et pour une bonne raison, nous n'utilisons ni espaces ni majuscules dans nos identifiants (colonnes, tableaux, schémas, etc.). L'utilisation de _ est purement style cependant.

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

De là, vous pouvez modifier les commandes à exécuter, supprimer celles dont vous ne voulez pas ou exécuter \gexec et tous les problèmes disparaissent.

3
Evan Carroll