繁体   English   中英

MySQL - 搜索模式

[英]MySQL - search for patterns

我试图找出某人是否有一种优雅的方式来查找存储在varchar字段中的数据模式,其中值是未知的 - 这意味着我不能使用LIKE。 例如,假设一个名为test的表看起来像这样:

id, str

并且数据看起来像这样:

1, YUUUY
2, DDDMM
3, MMMMT
4, XMXMX

我想做一个选择,它将返回str的值具有与ABABA模式匹配的模式的任何内容。 ABABA在这里显示的是一个模式,而不是文字字母。 所以匹配这个模式的唯一一个是id = 4.是否有一个正则表达式,我可以使用这样的模式匹配? 为了确保我清楚这些模式:

The pattern for id=1 is ABBBA.  
The pattern for id=2 is AAABB.  
The pattern for id=3 is AAAAB.

运行查询时,我将知道要搜索的模式。

或者,如果它更容易,我可以将表设置为:

id,c1,c2,c3,c4,c5

并且数据看起来像这样:

1,Y,U,U,U,Y
2,D,D,D,M,M
3,M,M,M,M,T
4,X,M,X,M,X

不确定这是否更容易,但我认为如果数据设置如此,regexp就在窗外。

不幸的是,它看起来不像MySQL支持正则表达式组。 我希望你可以做这样的事情来匹配ABBBA,例如:

([A-Z])([A-Z])\2\2\1

示例: http//regexr.com/3d8gu

看起来有一个MySQL插件可能支持它:

https://github.com/mysqludf/lib_mysqludf_preg

这是一个真正的hacky方式来做到这一点。

ABBBA(或YUUUY等):

SELECT id, name FROM table WHERE    
  substring(name,1,1) = substring(name,5,1) AND      
  substring(name,2,1) = substring(name,3,1) AND
  substring(name,3,1) = substring(name,4,1);

AAABB(或DDDMM等):

SELECT id, name FROM table WHERE    
  substring(name,1,1) = substring(name,2,1) AND      
  substring(name,2,1) = substring(name,3,1) AND
  substring(name,4,1) = substring(name,5,1);

AAAAB(或MMMMT等):

SELECT id, name FROM table WHERE    
  substring(name,1,1) = substring(name,2,1) AND      
  substring(name,2,1) = substring(name,3,1) AND
  substring(name,3,1) = substring(name,4,1) AND
  substring(name,4,1) != substring(name,5,1);

你得到的照片......

如果将数据分成不同的列,则类似。 您只需比较列,而不是比较子字符串。

在MySQL中没有正则表达式支持来进行那种模式匹配,没有。

SQL不是专门为字符串的模式匹配(或单独列中的值模式)而设计的。

但是......我们可以提出一些可行的东西,即使它不是一个正则表达式而且它不优雅。

假设我们没有自定义构建的用户定义函数,我们想使用本机MySQL函数和表达式......

并假设我们正在寻找的模式保证只包含两个不同的字符......

假设我们正在查看五个角色......

假设我们匹配的模式字符串将始终以字母“A”开头,并且模式中的“其他”字母也将为“B”

做这样的事情不会太难看:

SELECT t.id
     , t.str
  FROM myable t         
WHERE CONCAT('A'
        ,IF(MID(t.str,2,1)=MID(t.str,1,1),'A','B')
        ,IF(MID(t.str,3,1)=MID(t.str,1,1),'A','B')
        ,IF(MID(t.str,4,1)=MID(t.str,1,1),'A','B')
        ,IF(MID(t.str,5,1)=MID(t.str,1,1),'A','B')
      ) = 'ABBBA'

字符串中的第一个字符自动转换为“A”。

第二个字符,如果匹配第一个字符,那么它也是'A',否则它是'B'。

我们对第三,第四和第五个角色做同样的事情。

将'A'和'B'字符连接成一个字符串,现在我们可以对模式字符串进行相等比较,模式字符串由'A'和'B'组成,以'A'开头。

但如果陈述的假设不正确,那将会分崩离析。 如果str的长度小于5个字符,如果它包含两个以上不同的字符(我们将看到第一个字符匹配...这将看到str = XYYZX作为匹配模式ABBBA。(第一个字符是自动匹配A ,并且第五个字符与第一个字符匹配,因此它是A,并且所有其他字符都不匹配,因此它们是'B',即使它们不相同。

等等。

我们可以添加一些额外的检查。

例如,为了保证str的长度恰好是五个字符......

AND CHAR_LENGTH(t.str)=5

请注意,MySQL中的默认排序规则不区分大小写。 这意味着MmmmM的str值将转换为'AAAAA',而不是'ABBBA'。 并且MmmKk的str值将匹配'AAABB'。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM