【问题标题】:MySQL ORDER BY ignoring numericsMySQL ORDER BY 忽略数字
【发布时间】:2016-09-13 10:36:14
【问题描述】:

如果我有 4 个地址行如下:

1 West Road
65 Brown Street
800 Albian Road
Holland House

我想订购它们,但忽略前面的数字,因此它们将按以下顺序结束:

800 Albian Road
65 Brown Street
Holland House
1 West Road

这可能吗?

【问题讨论】:

  • 如果您使用 mariadb,SELECT * FROM address ORDER BY REGEX_REPLACE(line1, '/^[0-9]+/', ''); 可能是可能的。遗憾的是不在 MySQL 5.6 中:sqlfiddle.com/#!9/737629/3
  • 没有那么简单。看看这个a forum 这不像是他们给出了答案
  • 我建议现在用alter table 做一个丑陋的hack,添加列,并让其中的数据以PO Box 1919Brown Street 等非数字开头,然后从那里开始。您可以在触发器期间(触发器之前或之后)使用 mysql 函数进行插入或更新,以获取已清理的非数字开头部分。或者,也许您实际上可以将该函数使用嵌入到您的查询中,而不需要该列。所以我会为Function创作而摇摆

标签: mysql


【解决方案1】:

我建议以下功能。它在底部进行了测试。

DROP FUNCTION IF EXISTS noNumAtFront;
DELIMITER $$
CREATE FUNCTION noNumAtFront(s VARCHAR(100))
    RETURNS VARCHAR(100)
BEGIN
    DECLARE i,iSize INT;
    DECLARE bContinue BOOL DEFAULT TRUE;
    DECLARE ls VARCHAR(100); -- local s
    DECLARE retString VARCHAR(100);
    SET ls=LTRIM(s);
    SET iSize=LENGTH(ls);
    SET i=1;
    WHILE (i<=iSize AND bContinue) DO
        IF ASCII(SUBSTRING(ls,i,1)) NOT BETWEEN 48 AND 57 THEN
            SET bContinue=FALSE;
        ELSE
            SET i=i+1;
        END IF;
    END WHILE;
    SET retString=RIGHT(ls,iSize-i+1);
    -- RETURN CONCAT('i= ',i);
    RETURN(TRIM(retString));
END;$$
DELIMITER ;

测试

SELECT noNumAtFront('canal ave.');
SELECT noNumAtFront('8 fff');
SELECT noNumAtFront(' PO Box 1');
SELECT noNumAtFront('');
SELECT noNumAtFront('15151515');
SELECT noNumAtFront('5');

更好的测试:

CREATE TABLE addr
(   ID int AUTO_INCREMENT PRIMARY KEY,
    address1 VARCHAR(100) NOT NULL
);
INSERT addr (address1) VALUES ('canal ave.'),('123 Main St'),('3 abc lane');

select addr1 as address 
FROM 
(   select noNumAtFront(address1) as addr1 FROM addr 
) d 
ORDER BY address; 
+------------+
| address    |
+------------+
| abc lane   |
| canal ave. |
| Main St    |
+------------+

d 是派生表名。每个派生表都需要一个名称,否则会出错。需要这样的包装器将函数输出清理为名称,然后(在外部查询中)对其进行排序。

此版本 2 编辑在给定函数的末尾有一个 TRIM。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多