反向 EBCDIC 在 ROW_NUMBER 函数中对字母前的数字进行排序

Reverse EBCDIC sorts numbers before letters in ROW_NUMBER function

所以我有关注 SQL select

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

键的类型为 VARCHAR(12)。我想知道为什么数字排在字母之后。包括 UTF-8 在内的所有其他系统总是以数字开头。

DB2 很可能使用 EBCDIC 作为其用于排序的默认字符集,它在字母后有数字: http://astrodigital.org/digital/ebcdic.html

因此,您可以采取的解决方案是利用 EBCDIC 字符顺序。 特殊字符排在字母之前!

如果数值被替换,例如 0 -> .0,排序会自动正确进行。因为这意味着不涉及到 ASCII 的“转换”,如果对大量数据进行排序,它也不会那么昂贵。

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

以及对此的查询:

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