Skip to content
Advertisement

Reverse EBCDIC sorts numbers before letters in ROW_NUMBER function

So I do have following SQL select

SELECT FOO.*, ROW_NUMBER() OVER (ORDER BY KEY ASC) AS ROW_NUMBER
FROM FOO

enter image description here

Key is of the type VARCHAR(12). I wonder why the hell the numbers are sorted after the letters. Every other system including UTF-8 always begins with numbers.

enter image description here

Advertisement

Answer

So a solution you can do is to take advantage of the EBCDIC character order. Special characters are sorted before the letters!

If the numeric values are replaced, for example, like 0 -> .0, the sorting automatically works correctly. As this means there is no “conversion” to ASCII involved it’s also not so expensive if a lot data is sorted.

RAW_DATA CONVERTED FOR ROW_NUMBER ORDER BY ROW_NUMBER
ABC ABC .0.0.1
A1C A.1C .0.1AF
0A1 .0A.1 .0A.1
001 .0.0.1 .0A.1B
A01 A.0.1 .1.0A
10A .1.0A A.0.1
ADFG ADFG A.0B.1.1
01AF .0.1AF A.1C
0A1B .0A.1B AB.0.1.0
BA0 BA.0 ABC
A0B11 A.0B.1.1 BA.0
AB010 AB.0.1.0 ADFG

And the query for that:

SELECT FOO.*, 
ROW_NUMBER() OVER (ORDER BY REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(KEY, '0', '.0'),'1', '.1'),'2', '.2'),'3', '.3'),'4', '.4'),'5', '.5'),'6', '.6'),'7', '.7'),'8', '.8'),'9', '.9') ASC) AS ROW_NUMBER
FROM FOO
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement