Files
awesome-copilot/skills/reviewing-oracle-to-postgres-migration/references/oracle-to-postgres-sorting.md
T
github-actions[bot] c135c0e910 chore: publish from main
2026-07-14 01:07:23 +00:00

2.7 KiB

Oracle to PostgreSQL Sorting Migration Guide

Purpose: Preserve Oracle-like sorting semantics when moving queries to PostgreSQL.

Key points

  • Oracle and PostgreSQL default collations can differ significantly.
  • Use COLLATE "C" only when you explicitly need Oracle-like binary ordering and no different sort rule is requested.
  • If Oracle uses explicit linguistic ordering (for example NLS_SORT = French), map to an explicit PostgreSQL locale collation instead of forcing "C".

1) Standard SELECT … ORDER BY

Goal: Keep Oracle-style ordering.

Pattern (only when Oracle-compatible binary ordering is required):

SELECT col1
FROM your_table
ORDER BY col1 COLLATE "C";

Notes:

  • Apply COLLATE "C" only to sort expressions that must mimic Oracle binary ordering.
  • Works with ascending/descending and multi-column sorts, e.g. ORDER BY col1 COLLATE "C", col2 COLLATE "C" DESC.

1b) Locale-aware ordering (when Oracle used NLS_SORT)

If Oracle used locale-specific sorting such as:

ORDER BY nlssort(Externalusers.UserID, 'NLS_SORT = French')

map to an explicit PostgreSQL collation, for example:

ORDER BY Externalusers.UserID COLLATE "ca_FR.utf-8"

Use a collation that exists in the target environment. Discover available collations with:

SELECT collname, collprovider, collcollate, collctype
FROM pg_collation
ORDER BY collname;

2) SELECT DISTINCT … ORDER BY

Issue: PostgreSQL enforces that ORDER BY expressions appear in the SELECT list for DISTINCT, raising: Npgsql.PostgresException: 42P10: for SELECT DISTINCT, ORDER BY expressions must appear in select list

Oracle difference: Oracle allowed ordering by expressions not projected when using DISTINCT.

Recommended pattern (wrap and sort):

SELECT *
FROM (
  SELECT DISTINCT col1, col2
  FROM your_table
) AS distinct_results
ORDER BY col2 COLLATE "C";

Why:

  • The inner query performs the DISTINCT projection.
  • The outer query safely orders the result set and adds an explicit collation where needed to align with Oracle sorting.

Tips:

  • Ensure any columns used in the outer ORDER BY are included in the inner projection.
  • For multi-column sorts, collate each relevant expression: ORDER BY col2 COLLATE "C", col3 COLLATE "C" DESC.

Validation checklist

  • Applied explicit collation only where required ("C" for Oracle-style binary ordering, locale collation for linguistic ordering).
  • For DISTINCT queries, wrapped the projection and sorted in the outer query.
  • Confirmed ordered columns are present in the inner projection.
  • Re-ran tests or representative queries to verify ordering matches Oracle outputs.