1) состоящих более из 7 слов
Без регекспов:
Если разделители пробелы, количество слов = length(str)-length(replace(str,' ','')) + 1
Убрать дублирующиеся пробелы можно как-то так: replace(replace(replace(str,' ','~ '),' ~',''),'~','')
select *
from (select str,replace(replace(replace(str,' ','~ '),' ~',''),'~','') sstr from t) s
where length(sstr)-length(replace(sstr,' ','')) +1 > 7
Регекспами:
select * from t where ' '||str ~ '(\s+\S+){8,}'
2) содержащих только символы от 'a' до 'z', от 'а' до 'я', цифры и знак '-'
select * from t where str ~ '^[-\w\dа-я]+$'