我有一个包含数千行的表。这些结果是通过查询具有名称列表的api产生的。
对于“ John Snow”的搜索,api将返回其数据库中包含令牌“ john”和令牌“ snow”的所有条目。所以我有很多误报。
我想做的就是对表进行子集化,这样我就只有记录title
列(包含与搜索字符串匹配的字符串的列)包含搜索字符串的所有元素的记录, 与订单无关。
我尝试了
select * from table where 'john snow' ~* title;
select * from table where 'john snow' ILIKE '%' || title || '%';
两者均有效,但前提是列title
恰好包含该顺序的john snow
。
之前
str_searched | title
-------------+-------
john snow | snow white
john snow | john wick
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
之后
str_searched | title
-------------+-------
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
答案 0 :(得分:2)
SELECT
*
FROM
my_table
WHERE
regexp_split_to_array(lower('john snow'), ' ')
<@ regexp_split_to_array(lower(title), ' ')
lower()
标准化大写字母regexp_split_to_array()
将文本转换为空格处的数组[john,snow]
和[mr,john,snow]
)。 <@
比较器检查右数组包含的左数组是否完整。