Postgres选择非正则表达式查询

时间:2018-02-11 09:00:59

标签: sql postgresql

我们希望执行以下操作:

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')太短了。)

2 个答案:

答案 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].*';

Demo