2016-09-13 2 views
1

Wenn ich 4 Adressleitungen haben wie folgt:MySQL ORDER BY ignorieren Numerik

1 West Road 
65 Brown Street 
800 Albian Road 
Holland House 

Ich möchte sie bestellen, aber die Numerik an der Front ignorieren, so würden sie in dieser Reihenfolge am Ende:

800 Albian Road 
65 Brown Street 
Holland House 
1 West Road 

Ist das möglich?

+0

Wenn Sie Mariadb verwenden, ist 'SELECT * FROM-Adresse ORDER BY REGEX_REPLACE (line1, '/^[0-9] + /', ''); möglicherweise möglich. Leider nicht in MySQL 5.6: http://www.sqlfiddle.com/#!9/737629/3 – jedifans

+0

Mögliche Duplikate von [MYSQL wählen Sie ein Stück einer Zeichenfolge und Reihenfolge von diesem Stück] (http://stackoverflow.com/ questions/6475936/mysql-select-ein-stück-von-a-string-und-bestellen-durch-das-stück) – Tushar

+0

Es ist nicht ganz so einfach. Sieh dir das an (ein Forum) (http://www.futurequest.net/forums/archive/index.php/t-20869.html) es ist nicht so, als hätten sie eine Antwort geknackt – Drew

Antwort

2

Ich schlage folgende Funktion vor. Es wird unten getestet.

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 ; 

Test

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

Bessere Test:

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 ist ein Tabellenname abgeleitet. Jede abgeleitete Tabelle benötigt einen Namen oder Fehler. Ein solcher Wrapper wird benötigt, um die Funktionsausgabe in einen Namen und später (in der äußeren Abfrage) zu sortieren, um danach zu sortieren.

Diese Version 2 bearbeiten hat ein TRIM am Ende der Funktion gegeben.