我正在使用一组大型的历史数据(从平面文件数据库转换而来),其中一个字段格式为记录输入的年份的最后2位数,后跟4位数字增量...
例如,1998年创建的第三个记录将为“980003”,2004年创建的第11个记录将是“040011”。
我无法更改这些值 - 它们存在于公司、州、客户等方面。我知道将年份和其余部分分开成单独的列会很好,但这是不可能的。我甚至无法在"内部"进行分离,因为每行有约300个可排序的字段,并且他们非常习惯将此字段作为记录标识符。
所以我正在尝试实现一个MySQL UDF(第一次尝试)来进行排序。查询成功执行,并允许我“从表中选择任何内容按custom_sort(whatever)排序”,但排序结果与我的预期不同。
这是我正在使用的:
DELIMITER //
CREATE FUNCTION custom_sort(id VARCHAR(8))
RETURNS INT
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE year VARCHAR(2);
DECLARE balance VARCHAR(6);
DECLARE stringValue VARCHAR(8);
SET year = SUBSTRING(0, 2, id);
SET balance = SUBSTRING(2, 6, id);
IF(year <= 96) THEN
SET stringValue = CONCAT('20', year, balance);
ELSE
SET stringValue = CONCAT('19', year, balance);
END IF;
RETURN CAST(stringValue as UNSIGNED);
END//
记录只能追溯到96年(因此任意“如果前两个字符小于96,则前置‘20’,否则前置‘19’”)。对于这一点我不太满意,但我认为这不是核心问题。
另外,情况更加复杂,1996年和1997年都是5位数,遵循上述相同的模式,但增量变成了3位数。再次提醒,我认为这可能会成为一个问题,但不是核心问题。
以下是custom_sort返回的示例结果:
001471
051047
080628
040285
110877
020867
090744
001537
051111
080692
040349
110941
020931
090808
001603
051175
我真的不知道我在这里做什么,也从未像这样使用MySQL来创建UDF - 希望能得到帮助。
非常感谢您提前给予的帮助。
/编辑 打错字
/编辑 2 需要连接 "year" 值 - 仍然得到相同的结果
LPAD
函数:http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_lpad - biziclop