使用SQL进行模式匹配

时间:2013-04-14 02:58:06

标签: mysql sql database oracle pattern-matching

我需要使用SQL匹配下面提到的模式。

  1. " *谢谢你"
  2. " * MUSIC *"
  3. "我喜欢* MUSIC"
  4. "我喜欢*音乐和*绘画"
  5. 输入字符串将如下所示,
    "嗨谢谢你" - >应该匹配" *谢谢你"
    "我非常喜欢音乐" - >应匹配" * MUSIC *"

    有没有办法使用标准SQL语法执行此操作。

    请帮忙。

    谢谢。

2 个答案:

答案 0 :(得分:1)

Oracle MySQL示例查询:

不区分大小写:

select * from database where column like '%THANK YOU%';

区分大小写:

select * from database where column LIKE BINARY '%THANK YOU%';

不区分大小写:

select * from database where column REGEXP 'THANK YOU';

Oracle查询:

select * from database WHERE REGEXP_LIKE(column, 'THANK YOU', 'i')

您可以在Oracle中使用LIKE,但不区分大小写的设置取决于版本。

区分大小写:

select * from database WHERE column LIKE 'THANK YOU';

有很多关于使Oracle不区分大小写的讨论。为此使用reg_exp版本更容易,并为不区分大小写设置i标志。

<强>更新 最初的问题实际上与我的第一个答案相反,它确实让我开放了很多关于我为数据挖掘构建的应用程序。实际上昨晚有这个想法,但原来的海报在我做之前贴了它(小提琴掉了)。你可以让Regex匹配MySQL中REGEXP函数的两面。因此,如果将表达式列表存储到数据库中,那么您实际上可以将表达式列表与条目表或单个字符串进行比较。

我在这里添加了一个SQL小提琴:http://sqlfiddle.com/#!8/701a0/2

注意在原始示例中,&#34;正则表达式&#34;数据库中的值仅以星号开头。在Regex中,实际的字符串需要是。*可能是任何字符。

我已添加了一些示例,用于匹配网站,美国免费电话号码和Gmail帐户等内容。

INSERT INTO `myRegex` VALUES (1,'.* THANK YOU$'),(2,'MUSIC'),(3,'I LIKE .* MUSIC'),(4,'I LIKE .* MUSIC AND .* PAINTING'),(5,'^[0-9]?[ .-]?(800|866)'),(6,'\\.com$'),(7,'\\.net$'),(8,'\\.(gmail|googlemail)\\.'),(9,'THANK YOU');

输出

select * from myRegex where 'HI THANK YOU' REGEXP reg_expr;

enter image description here

select * from myRegex where 'THANK YOU MUCH' REGEXP reg_expr;

enter image description here

答案 1 :(得分:1)

我找到了一种使用MySQL的方法,

SELECT * FROM知识'谢谢你'REGEXP pattern_col;

pattern_col包含正则表达式。