我有以下查询:
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匹配相同类型的查询。
然后关键字和关键字2的两个表达式都必须为真,我只需要那些结果。
例如文本
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.
ANSWER
最终查询已成为
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 能够使用关键字数量来搜索字符串,所以这是最好的解决方案。
感谢所有观看。
答案 0 :(得分:1)
您可以使用正则表达式(^| )KEYWORD[- ,.:;'"!?]
并将WHERE子句中的两个REGEXP测试进行AND运算。第一部分(^| )
是一个正则表达式,它允许我们匹配文本的开头或空格。接下来是关键字,必须按原样匹配,然后是[]
之间的字符类,该类中的单个字符必须与之匹配。对于完整的正则表达式,它就像单个字符的OR而不是|
。
SELECT *
FROM`library`
WHERE
UCASE(`text` ) REGEXP '(^| )KEYWORD[- ,.:;''"!?]'
AND
UCASE(`text` ) REGEXP '(^| )KEYWORD2[- ,.:;''"!?]'
免责声明:我没有测试过SQL语句,我不记得是否必须在字符串中加倍撇号。