我正在尝试查询 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 中的值大写,以便它有更多匹配机会。 Ilike 也有可能。
谢谢。
最佳答案
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
关于sql - 在 Postgres 的数组列中使用 UPCASE 或 Regexp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22972712/