当前位置: 首页 > 面试题库 >

MySQL-为自定义排序创建用户定义的函数

缑智敏
2023-03-14
问题内容

我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量…

例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 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(因此,任意的“如果前2个字符少于96,则在前面加上‘20’,否则在前面加上‘19’)。我对此并不感到兴奋,但不相信这是核心问题是。

为了进一步努力,事实证明1996和1997都是5位数字,遵循上述相同的模式,但不是4位数字的增量,而是3位数字的增量。同样,我怀疑这将是一个问题,但不是核心问题。

我通过此custom_sort获得的回报示例:

001471
051047
080628
040285
110877
020867
090744
001537
051111
080692
040349
110941
020931
090808
001603
051175

我真的不知道我在这里做什么,并且从未将MySQL用于这样的UDF-任何帮助将不胜感激。

TYIA

/编辑错字

/ EDIT 2 concat需要增加“年”值-仍然得到相同的结果


问题答案:

您的子字符串有一些问题,并且强制转换为int使其在末尾而不是按年对具有更多数字的值进行排序。这应该更好地工作;

DELIMITER //

CREATE FUNCTION custom_sort(id VARCHAR(8))
    RETURNS VARCHAR(10)
    READS SQL DATA
    DETERMINISTIC
    BEGIN
        DECLARE year VARCHAR(2);
        DECLARE balance VARCHAR(6);
        DECLARE stringValue VARCHAR(10);
        SET year = SUBSTRING(id, 1, 2);
        SET balance = SUBSTRING(id, 3, 6);
        IF(year <= 96) THEN
            SET stringValue = CONCAT('20', year, balance);
        ELSE
            SET stringValue = CONCAT('19', year, balance);
        END IF;
        RETURN stringValue;
    END//

DELIMITER ;

这可以简化为;

DELIMITER //

CREATE FUNCTION custom_sort(id VARCHAR(8))
    RETURNS varchar(10)
    DETERMINISTIC
    BEGIN
        IF(SUBSTRING(id, 1, 2) <= '96') THEN
            RETURN CONCAT('20', id);
        ELSE
            RETURN CONCAT('19', id);
        END IF;
    END//

DELIMITER ;


 类似资料:
  • 问题内容: 我有这样的查询: 但是,当我打印出来时,它会自动进行1,2,3,4,5的排序。我们如何在不更改数据库结构的情况下保持顺序(2,4,1,5,3)? 谢谢! 问题答案: 我问这个: mysql按问题排序 我得到的答案和所有功劳归于他们: 您可以使用CASE运算符指定顺序: 在PHP中,你可以像这样:

  • 我希望用户能够编辑管理后端面板上自己的电子邮件内容,用户可以使用一些指令,如: 因此,例如,用户可以在 : 我如何在Laravel中创建一些自定义指令,任何我可以用来简化开发的库?当然,用户不允许使用PHP代码。 我知道有Laravel刀片,但我不确定这是安全的,用于公众用户编辑内容和只允许客户指令。

  • 我正在使用 Scala,并希望构建自己的数据帧函数。例如,我想将一列视为数组,循环访问每个元素并进行计算。 首先,我尝试实现自己的getMax方法。因此列x的值为[3,8,2,5,9],该方法的预期输出为9。 下面是它在Scala中的样子 这是我目前所知道的,并得到这个错误 我不知道如何迭代该列。 } 一旦我能够实现自己的方法,我将创建一个列函数 然后我希望能够在SQL的陈述中使用它 给定输入列[

  • 主要内容:函数定义函数是一组可重复使用的代码,可以在程序中的任何地方调用。这消除了一遍又一遍地编写相同的代码的需要。这使程序员能够将一个大程序划分成许多小的可管理的功能模块。 除了内置函数外,VBA还允许编写用户定义的函数。 在本章中,我们将学习如何在VBA中编写自己的函数。 函数定义 一个VBA函数可以有一个可选的语句。如果要从函数返回值,则可使用语句。 例如,可以在一个函数中传递两个数字,然后从函数中返回它们的

  • 问题内容: 我有一个问题:这是由ElementTree库形成的列表列表。 word1..4可能包含Unicode字符,即(â,ü,ç)。 我想按我的自定义字母对列表列表进行排序。 我知道如何从这里按python中的单词对自定义字母进行排序 我也知道如何从此处http://wiki.python.org/moin/HowTo/Sorting按键排序 问题是我找不到如何应用这两种方法对“列表列表”进行

  • 有的时候我们希望排序不是仅仅按照自然顺序排序。例如,我们希望按照字符串的长度来对一个字符串数组排序而不是按照字母顺序来排序。这里我们介绍一下Go的自定义排序。 package main import "sort" import "fmt" // 为了能够使用自定义函数来排序,我们需要一个 // 对应的排序类型,比如这里我们为内置的字符串 // 数组定义了一个别名ByLength type ByLe