1

我有以下查询:

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以关键字搜索字符串的数量为依据,所以这是最好的解决方案。

谢谢大家收看。

4

1 回答 1

1

您可以使用正则表达式(^| )KEYWORD[- ,.:;'"!?]并将两个 REGEXP 测试放在您的 WHERE 子句中 AND 一起。第一部分(^| )是一个正则表达式,它允许我们匹配文本或空格的开头。接下来是必须按原样匹配的关键字,然后是一个字符类,该类[]中的单个字符必须匹配。它就像单个字符的 OR,而不是|完整的正则表达式。

SELECT *
FROM`library`
WHERE
UCASE(`text` ) REGEXP '(^| )KEYWORD[- ,.:;''"!?]'
AND
UCASE(`text` ) REGEXP '(^| )KEYWORD2[- ,.:;''"!?]'

免责声明:我没有测试 SQL 语句,我不记得撇号是否必须在字符串中加倍。

于 2012-09-19T13:41:57.243 回答