【问题标题】:Pattern Matching Using SQL使用 SQL 进行模式匹配
【发布时间】:2013-04-14 02:58:06
【问题描述】:

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

  1. “*谢谢”
  2. "* 音乐 *"
  3. “我喜欢*音乐”
  4. “我喜欢 * 音乐和 * 绘画”

输入字符串将如下所示,
"HI THANK YOU" -> 应该匹配 "* THANK YOU"
"I LIKE MUSIC VERY MUCH" -> 应该匹配 "* MUSIC *"

有没有办法使用标准 SQL 语法来做到这一点。

请帮忙。

谢谢。

【问题讨论】:

  • 星号是错别字还是数据的一部分?为什么第二个目标字符串匹配数据2.而不是3.4.
  • 另外,“标准 SQL”是什么意思?您真的在寻找适用于 Oracle 和 MySQL RDBMS 的解决方案吗?
  • 是的 * 是数据的一部分。实际上它们是正则表达式。理想的情况是 SQL 查询适用于任何改动很小的 dbms。
  • 寻找文本挖掘解决方案。这不是经典数据库问题。
  • 正如@haki 所说,这不是标准SQL 可以解决的问题。每个 DBMS 使用略有不同的语法处理模式匹配。

标签: mysql sql database oracle pattern-matching


【解决方案1】:

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

SELECT * FROM Knowledge WHERE 'HI THANK YOU' REGEXP pattern_col;

pattern_col 保存正则表达式。

【讨论】:

  • 自己只是在测试这个。不得不上交。
【解决方案2】:

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 Fiddle:http://sqlfiddle.com/#!8/701a0/2

注意,在原始示例中,数据库中的“正则表达式”值仅以星号开头。在 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;

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

【讨论】:

  • Oracle 也支持直接 LIKE 运算符
  • 感谢您的快速回复,但我真正想要的是相反的方式。 HI THANK YOU 应该是输入,结果应该是“* THANK YOU”。
  • 所以你想从字面上找到“HI THANK YOU”?如果文本中没有“HI THANK YOU”,那么它将不匹配。您必须使用条件并构建 IF 语句。
  • @APC 如果他们想要不区分大小写,那么如果不使用 rexexp_like 运算符,您将无法通过 Oracle 获得它。
  • 在我的情况下,正则表达式存储在表中。我需要的是为输入文本找到正确的正则表达式。 “HI THANK YOU”是输入,匹配的正则表达式是“* THANK YOU”。 "* THANK YOU" 是存储在 db 表中的值。
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 2013-02-27
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多