DB2中存储为字符串的范围列排序问题咨询
解决DB2中VARCHAR区间列的数值排序问题
没问题!你碰到的是字符串字典序排序和数值排序的典型冲突——因为你的VALUE列是VARCHAR类型,DB2默认会按字符串的字符编码顺序来排序,所以100-300会排在30-50前面(毕竟字符1的ASCII码比3小)。
要实现你想要的按区间左端点数值排序的效果,只需要提取出-左边的部分,转换成整数后再排序即可。下面是具体的查询语句:
SELECT * FROM TABLENAME ORDER BY CAST(SUBSTR(VALUE, 1, LOCATE('-', VALUE) - 1) AS INTEGER);
语句说明:
LOCATE('-', VALUE):找到字符串中-符号的位置,比如对于10-30,返回的是3;SUBSTR(VALUE, 1, LOCATE('-', VALUE) - 1):从字符串开头截取到-符号的前一位,得到区间的左端点字符串(比如10、30);CAST(...) AS INTEGER:把截取到的字符串转换成整数类型,这样就能按照数值大小而非字符顺序排序了。
如果你的VALUE列存在不包含-的异常值,可以用CASE语句做兼容处理,比如:
SELECT * FROM TABLENAME ORDER BY CASE WHEN LOCATE('-', VALUE) > 0 THEN CAST(SUBSTR(VALUE, 1, LOCATE('-', VALUE) - 1) AS INTEGER) ELSE CAST(VALUE AS INTEGER) -- 处理没有分隔符的情况 END;
内容的提问来源于stack exchange,提问作者Ram




