在Postgres上的数组列中使用UPPERCASE或Regex

时间:2014-04-09 19:54:51

标签: sql ruby-on-rails ruby postgresql rails-postgresql

我正在尝试查询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中的值更新,以便它有更多的匹配机会。我也有可能。

感谢。

1 个答案:

答案 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