按字段排序最长字符串的字段

时间:2015-07-25 23:36:15

标签: java mysql csv collation

设置

我有三个mysql表,'course','section'和'time_slot'。我会定期根据以非规范化形式提供的CSV数据文件更新这些表。即。

--------------------------------------------------
| subject | number | section | days | start_time |
--------------------------------------------------
| EDSC    | 209    | A       | M    | 8:00       |
--------------------------------------------------
| EDSC    | 209    | A       | TR   | 8:00       |
--------------------------------------------------
| EDSC    | 209    | A       | T    | 8:00       |
--------------------------------------------------
etc...

注意:这些似乎重叠的原因是因为它们可能发生在不同的日期,但这与此问题无关

请注意,它们按星期几排序,多天条目在单日之前排序

我有这个sql查询试图匹配CSV的格式,然后以编程方式,我检查更新,添加,删除等。我的算法依赖于它们的顺序正确。

SELECT 
    c.subject, c.course_number, s.section_name, 
    t.days, t.start_time, t.end_time, t.building, t.room
FROM section s
JOIN course c on c.id=s.course_id
LEFT JOIN time_slot t on t.section_id=s.id
ORDER BY c.subject, c.course_number, s.section_name, t.start_time, t.days;

这会产生以下输出

--------------------------------------------------
| subject | number | section | days | start_time |
--------------------------------------------------
| EDSC    | 209    | A       | 1    | 8:00       |
--------------------------------------------------
| EDSC    | 209    | A       | 2    | 8:00       |
--------------------------------------------------
| EDSC    | 209    | A       | 2,4  | 8:00       |
--------------------------------------------------
etc...

注意,我在不添加自定义归类的情况下使用数字作为订购天数,并将CSV天数转换为代码中的数字

问题:有没有办法按最长字符串排在第一位的字段进行排序?我查看了LENGTH(t.days)DESC,但我还需要M来TR之前。

1 个答案:

答案 0 :(得分:0)

订购部分问题的快速和durty解决方案是在订单条款中将'ZZZZZZ'字符串附加到字段中:

...
ORDER BY t.days || 'ZZZZZZ' ASC
...

这样,较短的字符串将被推到结果的底部,同时保留第一个字符的顺序。

只需确保'ZZZ'字符串足够长,而Z实际上是您域中的最后一个字符。

<强>解释 如果您有两个值'A'和'AA',那么您的目标是获得以下顺序:

  • AA
  • A

如果您只是按字段订购:

  • A
  • AA

这是因为缺少char比排序函数的任何其他char少。

所以你需要用最后一个字符替换缺少的字符来修复它,添加'ZZZZ'就是这样做,结果是:

  • AAZZZZ
  • AZZZZ