mirror of
https://github.com/github/awesome-copilot.git
synced 2026-07-14 01:51:02 +00:00
2.7 KiB
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
DISTINCTprojection. - 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 BYare 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
DISTINCTqueries, 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.