我正在使用POSIX正则表达式从AWS Redshift查询数据。但是,我很难通过查找多个单词而不考虑顺序来查找整个字符串。
表格如下:
ID | full_term
123 | juice apple farm
123 | apple juice original
123 | banana juice
例如,我正在寻找同时包含apple
和juice
的整个字符串,因此我希望获得前两行。我当前的查询:
SELECT full_term FROM data_table
WHERE full_term ~ '(.*apple+)(.*juice+).*$'
但是,顺序在此方法中很重要。我也尝试了full_term ~ '(?=.*apple+)(?=.*juice+).*$'
,但收到一条错误消息[Amazon](500310) Invalid operation: Invalid preceding regular expression prior to repetition operator. The error occurred while parsing the regular expression fragment: '(?>>>HERE>>>=.*apple+)'.
,我刚刚发现?=
在Redshift中不起作用。
在这种情况下,使用UDF是唯一的解决方案吗?
另外,我只想要完整的apple
和juice
。也就是说,不应包含pineapple
。
答案 0 :(得分:1)
这可能最清楚地写为AND
版本的独立正则表达式匹配项。为了确保您不匹配,例如pineapple
在寻找apple
时,您需要检查搜索词的两边是否是空格字符或行的开头/结尾:
SELECT full_term FROM data_table
WHERE full_term ~ '(^|\\s)apple(\\s|$)'
AND full_term ~ '(^|\\s)juice(\\s|$)'