Techioz Blog

Postgres の配列列で UPCASE または Regexp を使用する

概要

大文字と小文字を無視し、おそらくスペースも無視して、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 でのパターン マッチングについて: