使用 RLIKE

问题描述

我正在处理使用 RLIKE 函数在文本块中查找某些单词的 SNowflake 查询。 这是我的查询的简化版本:

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

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

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

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

第 3 行:id = 3,text = '我看到绿色花园里有一朵红玫瑰'

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

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

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

编辑:只是为了澄清,我还想在我的结果中看到“红色花园中的红玫瑰”之类的东西,因为“红色”曾经出现在那里,而不会紧挨着“玫瑰”

解决方法

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

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 | green | blue ')