我的数据库有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 - >因为““不是”和‘坐’匹配(即至少有一个匹配存在)
我的数据库有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 - >因为““不是”和‘坐’匹配(即至少有一个匹配存在)
我认为你可以做到这一点是:
select t.*
from table t
where col1 rlike replace(col2, ' ', '|');
这会将col2
转换为正则表达式。所以,请注意,这个答案对col2
的内容非常敏感。如果它包含正则表达式特殊字符,那么这可能不起作用。
谢谢。我只是尝试过这一点,它似乎在大多数情况下都能正常工作,但我发现它错过了一些例如col1包含“我的新建筑公司”而col2包含“UP BOTTLING COMPANY”的地方。我可以看到这一定是由于字符之间的空格数量不一致造成的,所以替换不能很好地工作。由于trim/ltrim/rtrim不起作用,是否有简单优雅的解决方案? – user1729972
这个答案出现在低质量的审查队列中,可能是因为你没有解释代码。如果你解释它(在你的答案中),你更有可能得到更多的赞扬 - 而提问者更可能学到一些东西! –
你是什么意思的“火柴”?
这SELECT
会发现行,其中col1
包含的话is
或not
或sat
至少一个:
SELECT rec_num
FROM tbl
WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]';
这是说的那些话至少一种都存在col1
和col2
:
SELECT rec_num
FROM tbl
WHERE col1 REGEXP '[[:<:]](is|not|sat)[[:>:]]'
AND col2 REGEXP '[[:<:]](is|not|sat)[[:>:]]';
变化AND
到OR
询问是否存在其中一个或(或两者)列。
如果您需要相同字(是/不/周六)来匹配都col1
和col2
,是比较复杂的:
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,...)可以更好地完成这样的任务。
不,这应该适用于任何单词。是,不是,只是为了说明。 – user1729972
'单词'从哪里来?是否有应用程序代码生成此查询?你是否手动编写查询?你需要测试3个字吗? –
我只是试图选择表中的所有记录,其中col1(文本类型)列中至少有一个词也出现在col2列(也是文本类型)中。所以这个词可以是任何东西,因为表格的内容不能预先确定。 – user1729972
Tablescans,启动您的引擎! – Drew
只有2列?什么是rec#,某种id? – M0rtiis
这只是为了说明。查询将是SELECT * FROM thetable WHERE; (这是我坚持的正则表达式) –
user1729972