我们希望执行以下操作:
SELECT * FROM table WHERE char_length(text) >= 15 AND char_length(text) <= 100
但是,我们希望它只返回与此查询匹配的“text”列而不使用主题标签。那是:
如果text = 'hello how are you'
匹配
但
text = 'hello #how #are you'
将无法匹配(因为我们要过滤掉主题标签并且char_length('hello you')
太短了。)
答案 0 :(得分:3)
您可以从文本中删除主题标签,并检查剩余的字符串是否在您想要的长度范围内:
with t as (select 'this is some text' as txt union all
select 'this is #hashed text - loong' union all
select 'too short #despite #many #hashtags')
select * from t
where length(regexp_replace(txt, '#[a-z]+ *', '', 'g')) between 15 and 100
您可能想要使用正则表达式#[a-z]+ *
来识别您的标记。请注意,'g'
会使regexp_replace
替换所有出现的正则表达式,而不仅仅是第一个,请参阅PostgreSQL docs。
答案 1 :(得分:1)
尝试使用不匹配模式.*([ ]|^)#[a-z].*
的POSIX正则表达式:
SELECT *
FROM table
WHERE
char_length(text) >= 15 AND
char_length(text) <= 100 AND
text !~* '.*([ ]|^)#[a-z].*';