我正在处理一个Snowflake查询,它使用RLIKE函数在文本块中查找特定的单词。这是我的查询的简化版本:
SELECT id FROM table WHERE RLIKE (text,'.* red .*|.* green .*|.* blue .*','i')我要查询的表的一些示例:
第1行: id = 1,text =‘表是红色的,很漂亮’
第2行: id = 2,text =‘花园里有一朵红玫瑰’
第3行: id = 3,text =‘我在绿色的花园里看到一朵红玫瑰’
此时,查询将返回表中的所有3行。我想要做的是从结果中排除某个单词组合。在这个例子中,我想从结果中排除“红玫瑰”,但前提是文本中没有来自RLIKE列表的其他单词。
所以在我的结果中,ID1应该包括在内(‘红色’本身必须包括在内),ID2应该排除(‘红玫瑰’组合,文本中没有其他颜色)和ID3应该包括(即使它有‘红玫瑰’,它也有‘绿色’,所以应该包括在内)。
有没有办法做到这一点?提前感谢您的帮助
编辑:只是为了澄清,我也想在我的结果中看到像“红色花园中的红玫瑰”这样的东西,因为“红色”只出现在那里一次,而不是在“玫瑰”旁边。
发布于 2021-03-22 19:00:11
嗯。。。以下内容可能足以满足您的需求,并且它不使用正则表达式:
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 ')https://stackoverflow.com/questions/66744663
复制相似问题