反向 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
所以我有关注 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