sql - 在 Postgres 的数组列中使用 UPCASE 或 Regexp

标签 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 中的值大写,以便它有更多匹配机会。 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/

相关文章:

ruby-on-rails - 如果没有提供 authlogic,如何自动生成密码

ruby-on-rails - OmniAuth 路由错误,没有路由匹配

ruby-on-rails - RoR : PSQL to ruby - .加入

ruby-on-rails - Rails如何仅在前端而不是在管理中使用Friendly_id

ruby-on-rails - 有没有办法摆脱 IRB 中的 "hung"状态?

sql - 如何选择两个不同列的计数?

sql - Select 和 View 之间的执行计划差异

c# - 如何在本地运行设置mvc网站

mysql - 左连接条件

ruby-on-rails - 如何使用 devise gem 同时维护管理员和用户?(Rails 4)