我有以下查询:
SELECT * `library` WHERE
(
UCASE( `text` ) REGEXP '((^KEYWORD|[[.space.]]KEYWORD)([[.space.]]|[[.comma.]]|[[.period.]]|[[.colon.]]|[[.semicolon.]]|[[.apostrophe.]]|[[.quotation-mark.]]|[[.exclamation-mark.]]|[[.question-mark.]]))((^KEYWORD2|[[.space.]]KEYWORD2)([[.space.]]|[[.comma.]]|[[.period.]]|[[.colon.]]|[[.semicolon.]]|[[.apostrophe.]]|[[.quotation-mark.]]|[[.exclamation-mark.]]|[[.question-mark.]]))'
)
** 编辑 **
添加了一个 sql 小提琴:
http://sqlfiddle.com/#!2/8f822/2/0
在可读格式中,这是:
SELECT * FROM `library` WHERE
(
UCASE( `text` ) REGEXP '
(
(
^KEYWORD | [[.space.]]KEYWORD
)
(
[[.space.]] |
[[.comma.]] |
[[.period.]] |
[[.colon.]] |
[[.semicolon.]] |
[[.apostrophe.]] |
[[.quotation-mark.]] |
[[.exclamation-mark.]] |
[[.question-mark.]]
)
)
(
(
^KEYWORD2 | [[.space.]]KEYWORD2
)
(
[[.space.]] |
[[.comma.]] |
[[.period.]] |
[[.colon.]] |
[[.semicolon.]] |
[[.apostrophe.]] |
[[.quotation-mark.]] |
[[.exclamation-mark.]] |
[[.question-mark.]]
)
)
)'
现在我需要查询来执行以下操作,而我在这里碰壁了。
如果关键字出现在文本中,以文本开头或以空格开头,后跟特殊字符之一,则显示结果。
这并不像我需要的那样真正起作用,但是如果两者都出现,我无法在文档中找到如何进行匹配。例如尝试匹配字符串"keyword,"
,"keyword "
或"keyword;"
然后我需要为关键字 2 匹配相同类型的查询。
那么keyword 和keyword2 的两个表达式都必须为真,我只需要这些结果。
例如文本
A lazy brown fox jumped over the fence.
Then he found a chicken.
Then he ate the chicken and ran from the farmer.
和
A fox found a chicken.
Then he ate the chicken and ran from the farmer.
Then fox jumped over the fence.
应该带有以下关键字fence
chicken
但这不应该与以下文本匹配
A lazy brown fox jumped over the fences.
Then he found a chicken.
Then he ate the chicken and ran from the farmer.
回答
最后的查询变成了
SELECT *
FROM`library`
WHERE
UCASE(`text` ) REGEXP '(^| )FENCE[[.space.][.comma.][.period.][.colon.][.semicolon.][.apostrophe.][.quotation-mark.][.exclamation-mark.][.question-mark.]]'
AND
UCASE(`text` ) REGEXP '(^| )CHICKEN[[.space.][.comma.][.period.][.colon.][.semicolon.][.apostrophe.][.quotation-mark.][.exclamation-mark.][.question-mark.]]'
因为正则表达式不支持随机顺序搜索,而且我不希望n以关键字搜索字符串的数量为依据,所以这是最好的解决方案。
谢谢大家收看。