记一个开发是遇到的坑之Oralce 字符串排序

        简单描述一下情况,就是存储过程中用一个字符串类型的字段作为患者就诊的排序号,结果莫名发现叫完1号后叫了11、12等患者。用户的反馈不一定准确,自己加了日志的,赶紧拷贝日志来观察一下。结果发现实际情况就是这样的,一边说着不应该呀,一边开始看代码,一个个分析排序用到的字段,经过分析后发现由于这个字段是字符串所以排序规则是一个字符一个字符的比较的,单独写语句测试一下,果然如此。

WITH T AS
(SELECT '11' STR
    FROM DUAL
  UNION ALL
  SELECT '2' STR FROM DUAL
  UNION ALL
  SELECT '3' STR FROM DUAL
  UNION ALL
  SELECT '21' STR FROM DUAL
  UNION ALL
  SELECT '30' STR FROM DUAL
  UNION ALL
  SELECT '1' STR FROM DUAL)
SELECT * FROM T ORDER BY STR;

输出结果如下:

1    1
2    11
3    2
4    21
5    3
6    30

由于该字段会存储中文字符,最终利用 状态 字段和取字符串的数字部分转换为数值,然后进行排序。至于

取其中的数字部分,使用正则表达式

to_number(regexp_substr(nvl(字段a,0),'[0-9]+'))

记录一下自己遇到的坑,可能很简单,但是容易忽视。勤于实践、乐于记录,热爱分享。

原文地址:https://www.cnblogs.com/FreeLoopPowter/p/11325328.html