将“SQL SELECT STATEMENT”嵌套在REGEX运算符中/内

时间:2014-01-09 21:10:47

标签: mysql

假设我有一个名为People的表格,列PersonIDName,我可以选择一个人名:

SELECT Name FROM People WHERE PersonID = 1

对于此示例,将返回'John'

我还有另一个名为ForumPosts的表,其中包含ForumPostIDPostContent字段,其中PostContent只是TEXT,就本例而言,它可能类似于{{} 1}}或"My Name is John"

现在我想执行一个Query,它基于给定的初始PersonID将返回ForumPosts中所有行,其中Person的名称与PostContent字段中包含的单词匹配。

与单个单词匹配的正则表达式(或在此情况下为该人的姓名)为:

"John likes football"

理想情况下,我希望我的SQL逻辑类似于:

[[:<:]]*Person'sNameHere*[[:>:]]

但是我不确定这是否可行,或者我将如何构建查询。

2 个答案:

答案 0 :(得分:1)

听起来你想动态创建一个正则表达式。正则表达式只是MySQL中的字符串,因此您只需使用CONCAT来创建所需的字符串。

SELECT *
FROM ForumPosts
WHERE PostContent
    REGEXP CONCAT('[[:<:]]',(SELECT Name FROM People WHERE PersonID = '1'),'[[:>:]]')

更好的是,您可以使用JOIN而不是子查询

SELECT ForumPosts.*
FROM ForumPosts
JOIN People ON PersonID = 1
WHERE PostContent REGEXP CONCAT('[[:<:]]',People.Name,'[[:>:]]')

DEMO:http://sqlfiddle.com/#!2/40828/1

答案 1 :(得分:0)

您可以使用exists子查询来实现此逻辑。如果我理解你的逻辑:

select fp.*
from ForumPosts fp
where exists (select 1
              from people p
              where personid = '1' and
                    fp.PostContent regex concat('[[:<:]]', name, '[[:>:]]')
             )