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.
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
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
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