0

我正在研究使用 RLIKE 函数在文本块中查找某些单词的雪花查询。这是我的查询的简化版本:

SELECT id FROM table WHERE RLIKE (text,'.* red .*|.* green .*|.* blue .*','i')

我正在查询的表的一些示例:

第 1 行:id = 1, text = '桌子是红色的,很好看'

第 2 行:id = 2,文本 = '花园里有一朵红玫瑰'

第 3 行:id = 3,文本 = '我在绿色花园中看到一朵红玫瑰'

此时,查询将返回表中的所有 3 行。我想要做的是从结果中排除某个单词组合。在此示例中,我想从结果中排除“红玫瑰”,但前提是文本中的 RLIKE 列表中没有其他单词。

所以在我的结果中,应该包括 ID 1(必须包括本身的“红色”),应该排除 ID 2(“红玫瑰”组合,文本中没有其他颜色),应该包括 ID 3(即使它有“红玫瑰”,也有“绿色”,所以应该包括在内)。

有没有办法做到这一点?在此先感谢您的帮助

编辑:澄清一下,我还想在我的结果中看到“红色花园中的红玫瑰”之类的东西,因为“红色”在那里一次,而不是在“玫瑰”旁边

4

1 回答 1

0

嗯。. . 以下内容可能足以满足您的需求,并且不使用正则表达式:

SELECT id
FROM table
WHERE text like '% green %' or
      text like '% blue %' or
      (text like '% red %' and text not like '% red rose %');

这适用于您的示例数据。但它不会返回“红色花园中的红玫瑰”。我不确定你是否想要那个。

如果您希望该行也出现,那么一种方法是:

SELECT id
FROM table
WHERE text like '% green %' or
      text like '% blue %' or
      replace(text, 'red rose', '') like '% red %' ;

您可以使用rlike()相同的逻辑:

WHERE rlike(replace(text, 'red rose', ''), ' red | green | blue ')
于 2021-03-22T11:00:11.343 回答