You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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):从字符串开头截取到-符号的前一位,得到区间的左端点字符串(比如1030);
  • 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

火山引擎 最新活动