MySQL查询或正则表达式只找到模式D,E,F

时间:2014-04-22 11:45:12

标签: php mysql sql regex

我的google-fu让我失望了,如果有人能指出我正确的方向概念或术语会很棒。

我试图从mysql数据库中获取行。假设我的变量等于' DEF' 。 我想在数据库中搜索任何顺序只包含DEF的记录。

示例列,

    ABC
    BC
    D
    DEX
    DEF
    DEFF
    ED
    EDF
    FED
    FEED

会回来 D,DEF,ED,EDF,FED

3 个答案:

答案 0 :(得分:3)

您需要的是用户定义的函数来检查字符串是否匹配。这是一个:

delimiter //
create function permutes(needles varchar(255), haystack varchar(255)) returns bool
begin
    declare needles_position, first_occurance int;
    set needles_position = length(needles);
    while needles_position > 0 do
        set first_occurance = instr(haystack, substring(needles, needles_position, 1));
        if first_occurance = 0 then
            return false;
        end if;
        set haystack = (select concat(substring(haystack,1,first_occurance-1), substring(haystack,first_occurance+1)));
        set needles_position = needles_position - 1;
    end while;
    return true;
end//

现在你会得到你想要的东西:

select example_column from your_table where permutes(example_column ,'def');

该功能的作用是获取所有针字符并查看它们是否存在于大海捞针中。在检查下一根针之前,它是从大海捞针中取出的,所以你不会得到双打。

答案 1 :(得分:0)

我要离开这里,即使我意识到它没有解决问题。它会选择'FEED'。这个想法可能会帮助别人。

您可以使用rlikeregex

执行此操作
select *
from table t
where col rlike concat('[', 'DEF', ']+')

这是构建简单的正则表达式'[DEF]+',这是你想要的模式。

编辑:

如果将原始字符串分解为字符,则可以执行以下操作:

select t.col
from table t left outer join
     (select 'D' as c union all select 'E' union all select 'F'
     ) c
     on t.col like concat('%', c.c, '%')
group by t.col
having sum(c.c is null) = 0 and 
       sum(length(t.col) - length(replace(t.col, c.c, '')) > 1);

having子句中的第一个条件检查所有字符是否存在。第二个没有出现过多次。请注意,如果存在重复的字母用于比较,则无法使用此功能。

答案 2 :(得分:0)

我总结了以下可能性:

DEF
DFE
EDF
EFD
FDE
FED

REGEX (DEF|DFE|EDF|EFD|FDE|FED)


DF
DE
EF
ED
FE
FD

REGEX (DF|DE|EF|ED|FE|FD)

D
E
F

REGEX (D|E|F)

准确的查询将是:

WHERE
COLUMN_NAME REGEXP '^(DEF|DFE|EDF|EFD|FDE|FED)$' OR 
COLUMN_NAME REGEXP '^(DF|DE|EF|ED|FE|FD)$' OR
COLUMN_NAME REGEXP '^(D|E|F)$'

OR:

COLUMN_NAME 
REGEXP '^(DE{0,1}F{0,1}|DF{0,1}E{0,1}|ED{0,1}F{0,1}|
          EF{0,1}D{0,1}|FD{0,1}E{0,1}|FE{0,1}D{0,1})$'

最短:

REGEXP '^(D(E?F?|F?E?)|E(D?F?|F?D?)|F(D?E?|E?D?))$'

DEMO