假設你part_match的是一個總的形式^ XXXX和可選大小相等的^ YYYY |^ZZZZ | ...
SELECT * FROM parts
WHERE 'FG2-4G4T5' REGEXP part_match
ORDER BY instr(concat(part_match,'|'),'|') DEC
這會給你的最長前綴匹配。
爲了解決FULL匹配的夾雜物,需要一斷部分的匹配的長度,所以,
SELECT * FROM parts
WHERE 'FG2-4G4T5' REGEXP part_match
ORDER BY CASE WHEN part_match LIKE '^%' THEN -1 else 0 end +
instr(concat(part_match,'|'),'|') DEC
爲了解決REGEX涉及不等長度,例如多段^YYYY|^Z|ABC
,你首先需要找到打破了爲多行
part_match | single_part
^YYYY|^Z|ABC ^YYYY
^YYYY|^Z|ABC ^Z
^YYYY|^Z|ABC ABC
然後通過REGEXP引用single_part早在回答part_match的功能。這是不重要的,但可以通過Numbers表格和SUBSTR和INSTR的合理使用來實現。
創建一個數字表(運行此一次):
DROP PROCEDURE IF EXISTS CreateNumbersTable;
delimiter //
CREATE PROCEDURE CreateNumbersTable()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
drop table if exists Numbers;
create table Numbers (N int primary key);
SET @x := 0;
REPEAT
insert into Numbers values (@x);
SET @x := @x + 1;
UNTIL @x > 999 END REPEAT;
END//
delimiter ;
CALL CreateNumbersTable;
DROP PROCEDURE CreateNumbersTable;
然後你可以使用此查詢
select p.*
# ,substr(p.part_match, N.N+1, locate('|', concat(p.part_match,'|'), N.N+2) -N.N -1)
# ,length(substr(p.part_match, N.N+1, locate('|', concat(p.part_match,'|'), N.N+2) -N.N -1))
from parts p
inner join numbers N on N.N between 0 and length(p.part_match)
and ((N.N = 0) or (substr(p.part_match, N.N, 1) = '|'))
WHERE 'FG2-RGST' REGEXP p.part_match
and 'FG2-RGST' REGEXP substr(p.part_match, N.N+1, locate('|', concat(p.part_match,'|'), N.N+2) -N.N -1)
order by length(substr(p.part_match, N.N+1, locate('|', concat(p.part_match,'|'), N.N+2) -N.N -1)) DESC
取消註釋行2和3,看part_match的它匹配的零件。
哎呀,對不起@hsz吹你的編輯...我會放棄它。 – Donut 2011-03-08 19:37:40