我的google-fu让我失望了,如果有人能指出我正确的方向概念或术语会很棒。
我试图从mysql数据库中获取行。假设我的变量等于' DEF' 。 我想在数据库中搜索任何顺序只包含DEF的记录。
示例列,
ABC
BC
D
DEX
DEF
DEFF
ED
EDF
FED
FEED
会回来 D,DEF,ED,EDF,FED
答案 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'
。这个想法可能会帮助别人。
您可以使用rlike
或regex
:
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?))$'