我正在使用大量遗留数据(从平面文件数据库转换),其中字段格式化为输入记录的年份的最后2位数,然后是4位数增量...
例如,1998年创建的第三条记录为"980003",2004年创建的第11条记录为"040011".
我无法改变这些价值观 - 它们通过公司存在,在国家,客户等处注册.我知道将年份和其余部分分成不同的列是很好的,但这是不可能的.我甚至不能在"内部"真正做到这一点,因为每行有大约300个可以排序的字段,并且他们非常习惯使用这个字段作为记录标识符.
所以我试图实现一个MySQL UDF(第一次)进行排序.查询执行成功,它允许我"通过custom_sort(无论如何)从表顺序中选择任何东西",但顺序不是我所期望的.
这是我正在使用的:
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//
Run Code Online (Sandbox Code Playgroud)
记录只回到96(因此任意"如果前2个字符小于96,前置'20'否则前置'19'..我对这一点并不感到兴奋,但不相信那是核心所在问题是.
为了投入另一把扳手,事实证明1996年和1997年都是5位数,遵循上述相同的模式,而不是4位数的增量,它是3位数的增量.我再次怀疑这将是一个问题,但不是核心问题.
我通过此custom_sort获得的返回示例:
001471
051047
080628
040285
110877
020867
090744
001537
051111
080692
040349 …Run Code Online (Sandbox Code Playgroud) mysql ×1