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?
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
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.