假设你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