2015-09-05 30 views
0

我的数据库有2列包含文本。当它说的3条记录如下:MySQL正则表达式返回2列之间至少有一个词匹配的所有记录

rec# col1    col2 
1  my name is  fred is 
2  john    mike 
3  today not sat not it sat 

我将不胜感激帮助构建一个正则表达式将返回备案号:

1 - >,因为“是”匹配

3 - >因为““不是”和‘坐’匹配(即至少有一个匹配存在)

+0

Tablescans,启动您的引擎! – Drew

+0

只有2列?什么是rec#,某种id? – M0rtiis

+0

这只是为了说明。查询将是SELECT * FROM thetable WHERE ; (这是我坚持的正则表达式) – user1729972

回答

1

我认为你可以做到这一点是:

select t.* 
from table t 
where col1 rlike replace(col2, ' ', '|'); 

这会将col2转换为正则表达式。所以,请注意,这个答案对col2的内容非常敏感。如果它包含正则表达式特殊字符,那么这可能不起作用。

+0

谢谢。我只是尝试过这一点,它似乎在大多数情况下都能正常工作,但我发现它错过了一些例如col1包含“我的新建筑公司”而col2包含“UP BOTTLING COMPANY”的地方。我可以看到这一定是由于字符之间的空格数量不一致造成的,所以替换不能很好地工作。由于trim/ltrim/rtrim不起作用,是否有简单优雅的解决方案? – user1729972

+0

这个答案出现在低质量的审查队列中,可能是因为你没有解释代码。如果你解释它(在你的答案中),你更有可能得到更多的赞扬 - 而提问者更可能学到一些东西! –

0

你是什么意思的“火柴”?

SELECT会发现行,其中col1包含的话isnotsat至少一个:

SELECT rec_num 
    FROM tbl 
    WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]'; 

这是说的那些话至少一种都存在col1col2

SELECT rec_num 
    FROM tbl 
    WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]' 
     AND col2 REGEXP '[[:<:]](is|not|sat)[[:>:]]'; 

变化ANDOR询问是否存在其中一个(或两者)列。

如果您需要相同字(是/不/周六)来匹配col1col2,是比较复杂的:

SELECT rec_num 
    FROM tbl 
    WHERE (col1 REGEXP '[[:<:]]is[[:>:]]' 
     AND col2 REGEXP '[[:<:]]is[[:>:]]') 
     OR (col1 REGEXP '[[:<:]]not[[:>:]]' 
     AND col2 REGEXP '[[:<:]]not[[:>:]]') 
     OR (col1 REGEXP '[[:<:]]sat[[:>:]]' 
     AND col2 REGEXP '[[:<:]]sat[[:>:]]'); 

如果你的意思是别的东西,实践要求精确的问题。

附录

这不是在SQL实用发现哪个词(如果有的话)是常见的两个文本字段之间。用应用程序编程语言(PHP,Java,Perl,...)可以更好地完成这样的任务。

+0

不,这应该适用于任何单词。是,不是,只是为了说明。 – user1729972

+0

'单词'从哪里来?是否有应用程序代码生成此查询?你是否手动编写查询?你需要测试3个字吗? –

+0

我只是试图选择表中的所有记录,其中col1(文本类型)列中至少有一个词也出现在col2列(也是文本类型)中。所以这个词可以是任何东西,因为表格的内容不能预先确定。 – user1729972

相关问题