2013-04-14 90 views
1

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

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

输入字符串会看像这样,
“你好,谢谢你” - >应该匹配“*谢谢你”
“我喜欢音乐非常多” - >应该匹配“* MUSIC *”

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

请帮忙。

谢谢。

+0

星号是拼写错误还是部分数据?为什么第二个目标字符串匹配数据“2.”而不是“3.”或“4.”? – APC

+0

另外,“标准SQL”是什么意思?您真的正在寻找一种既适用于Oracle也适用于MySQL RDBMS的解​​决方案吗? – APC

+0

是*是数据的一部分。其实他们是regexps。理想的情况是SQL查询可以在任何dbms上进行小改动。 –

回答

1

甲骨文的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'; 

甲骨文查询:

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

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

区分大小写:

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

有很多关于使得甲骨文的喜欢不区分大小写的讨论。使用reg_exp版本更容易,并且为不区分大小写设置i标志。

更新 原来的问题实际上与我的第一个答案相反,它确实让我开始讨论我正在为数据挖掘构建的不少应用程序。昨天晚上实际上有这个想法,但是原来的海报在我做之前发布了它(Fiddle倒下了)。您可以使正则表达式匹配MySQL中REGEXP函数的两端。因此,如果您将一系列表达式存储到数据库中,那么您实际上可以将表达式列表与一个条目表或一个字符串进行比较。

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

注意,在原来的例子,在数据库中的“正则表达式”的价值观开始时只有一个星号。在正则表达式中,实际的字符串必须是。*可能是任何字符。

我已经添加了几个例子来匹配诸如网站,美国免费电话号码和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

+0

你弄错了。 – APC

+0

Oracle也支持直LIKE运算符 – APC

+0

感谢您的快速回复,但我真正想要的是另一种方式。你好,谢谢你应该是输入和结果应该是“*谢谢你”。 –

1

我发现了一个办法做到这一点使用MySQL,

小号选择*从知识哪里'你好,谢谢'REGEXP pattern_col;

pattern_col保存正则表达式。

+0

只是自己测试。不得不转入。 –