正確なルールに依存し、実際CHECK
に列に実装された制約。
列に常に 1 つのドットがcol
あり、すべての年が 4 桁の場合:
基本的な解決策
SELECT * FROM tbl
WHERE col LIKE to_char(now(), '"%."YYYY');
なんで?
同じデータ型と比較するのが最も効率的です。列は文字型 ( varchar
)であるため、または(return )よりもto_char()
(returns text
、実質的には) を使用します。varchar
EXTRACT
date_part()
double precision
さらに重要なことに、この式はsargableです。これは一般的に最も安価であり、(オプションの) インデックスのサポートが可能です。あなたの場合、トライグラムインデックスが機能します:
最適化
可能な限り高速 (読み取りパフォーマンス) と正確さを求め、テーブルの行数が少ない場合は、特殊な部分式インデックスを使用します。
CRATE INDEX tbl_year_idx ON tbl (cast(right(col, 4) AS int) DESC)
WHERE col ~ '\.\d{4}$'; -- ends with a dot and 4 digits
一致するクエリ:
SELECT * FROM tbl
WHERE col ~ '\.\d{4}$' -- repeat index condition
AND right(col, 4)::int = EXTRACT(year FROM col);
でパフォーマンスをテストしEXPLAIN ANALYZE
ます。
さらに一歩進んで、今年のインデックスを調整することもできます。
CRATE INDEX tbl_year2015_idx ON tbl (tbl_id) -- any (useful?) column
WHERE col LIKE '%.2015';
最初の「基本」クエリで動作します。
毎年インデックスを (再) 作成する必要があります。簡単な解決策は、数年前にインデックスを作成し、毎年別のインデックスを自動的に追加することです...
これは、別の方法を検討するポイントでもあります。年をテーブルの冗長integer
列として保存し、残りを単純化します。
それが私がすることです。