我正在尝试查询Postgres数组列而忽略大小写,甚至可能忽略空格。
SELECT "cats".* FROM "cats" WHERE ('CATS - PERSA' = ANY(UPCASE(cat_types))) ORDER BY "cats"."id" ASC LIMIT 1;
但是我收到了这个错误:
You might need to add explicit type casts.
作为奖励,我希望能够进行正则表达式,其中搜索会忽略cat_types列中值的空格。
我正在使用Ruby on Rails来做这件事。
cat_type.upcase.delete(' ')
Cats.where("'#{cat_type}' = ANY(cat_types)").first
查询只使用ANY,但我希望能够忽略空格并使cat_types中的值更新,以便它有更多的匹配机会。我也有可能。
感谢。
答案 0 :(得分:0)
SELECT DISTINCT c.*
FROM cats c, unnest(c.cat_types) AS cat_type
WHERE upper(translate(cat_type, ' ', '')) = 'CATS-PERSA'
ORDER BY id
LIMIT 1;
Postgres功能为upper()
,而不是upcase()
。
cat_types
似乎是一个数组,假设类型text[]
(信息缺失)。我unnest()
分别处理数组元素。使用ANY
无法做到这一点,这只适用于简单比较。
我在这里使用隐式LATERAL JOIN
,要求Postgres 9.3 + (信息缺失)。
如果多个数组元素匹配,则会在此处多次获取该行。因此DISTINCT
。
有关Postgres中模式匹配的更多信息:
Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL