隨着您調整的問題,原則仍然是一樣的。 我的第一個直覺是與額外的領域,但你可以使用存儲的功能。 你仍然需要將你的零件編號分成3部分(我認爲它不超過)。
- Part1是一個INTEGER,如果現有的第一個數字是其他數字,用maxint(part1最大)填充它。
- Part2是一個CHAR,包含字母(如果存在)。
- Part3是一個INTEGER,包含第二個數字(如果存在)。
您可以通過調用這些值的函數進行排序。
這裏是完整的資料來源: 爲了您的方便起見,請鏈接到工作SQL Fiddle。 這真的是草率/快速編程,但它的工作原理。在很短的時間內放在一起,我相信有改進的地方。你可以自己調整它。稍後,您可以從視圖中刪除part1,part2和part3。 (但把它留在order by
)它只是顯示如何完成排序。
DROP PROCEDURE IF EXISTS `uGetParts`//
DROP FUNCTION IF EXISTS `uExtractPart1`//
DROP FUNCTION IF EXISTS `uExtractPart2`//
DROP FUNCTION IF EXISTS `uExtractPart3`//
CREATE PROCEDURE `uGetParts`(
IN ins varchar(50),
OUT num1 int unsigned,
OUT num2 int unsigned,
OUT num3 int unsigned)
NO SQL
BEGIN
SET num1=0;
SET num2=0;
SET num3=0;
WHILE (num1<length(ins)) AND
(SUBSTRING(ins,num1+1,1) REGEXP('(^[0-9]+$)')=1) DO
SET num1=num1+1;
END WHILE;
SET num2=num1;
WHILE (num2<length(ins)) AND
(SUBSTRING(ins,num2+1,1) REGEXP('(^[0-9]+$)')=0) DO
SET num2=num2+1;
END WHILE;
SET num3=num2;
WHILE (num3<length(ins)) AND
(SUBSTRING(ins,num3+1,1) REGEXP('(^[0-9]+$)')=1) DO
SET num3=num3+1;
END WHILE;
END//
CREATE FUNCTION `uExtractPart1`(ins varchar(50))
RETURNS int unsigned NO SQL
BEGIN
DECLARE num1 INT default 0;
DECLARE num2 INT default 0;
DECLARE num3 INT default 0;
call uGetParts(ins,num1,num2,num3);
IF num1>0 THEN
RETURN CAST(SUBSTRING(ins,1,num1) AS UNSIGNED);
ELSE
RETURN ~0 >> 32;
END IF;
END//
CREATE FUNCTION `uExtractPart2`(ins varchar(50))
RETURNS varchar(50) NO SQL
BEGIN
DECLARE num1 INT default 0;
DECLARE num2 INT default 0;
DECLARE num3 INT default 0;
call uGetParts(ins,num1,num2,num3);
IF num2>num1 THEN
RETURN SUBSTRING(ins,num1+1,num2-num1);
ELSE
RETURN '';
END IF;
END//
CREATE FUNCTION `uExtractPart3`(ins varchar(50))
RETURNS int unsigned NO SQL
BEGIN
DECLARE num1 INT default 0;
DECLARE num2 INT default 0;
DECLARE num3 INT default 0;
call uGetParts(ins,num1,num2,num3);
IF num3>num2 THEN
RETURN CAST(SUBSTRING(ins,num2+1,num3-num2) AS UNSIGNED);
ELSE
RETURN 0;
END IF;
END//
你可以這樣調用:
SELECT
id,
TYPE,
uExtractPart1(TYPE) as part1,
uExtractPart2(TYPE) as part2,
uExtractPart3(TYPE) as part3
FROM Article
ORDER BY
uExtractPart1(TYPE),
uExtractPart2(TYPE),
uExtractPart3(TYPE)
來源
2013-07-06 21:10:15
Rik
第1步:定義決定的排序規則。 –
我以爲我有種病,但在編輯方面做得不錯。 – sharf
這似乎是你可以使用mysql REGEXP的情況。以下是您的初創公司:http://sqlfiddle.com/#!2/ffd2ce/7您可以在此處瞭解更多有關此用法的信息:http://dev.mysql.com/doc/refman/5.6/en/regexp .html – Gimmy